MYSQL 性能优化

1. 关闭不必要的二进制日志和慢查询日志,仅在内存足够或开发调试时打开它们

  1. SHOW variables LIKE '%slow%';

2. 适度使用 Query Cache
3. 增加MySQL允许的最大连接数。可用下面的语句査看MySQL允许的最大连接数

  1. SHOW variables LIKE 'max_connections';

4. 从表中删除大量行后,可运行OPTIMIZE TABLE TableName进行碎片整理。

发表在 mysql | 留下评论

MYSQl 数据存储引擎选择

( 1 ) 采用MylSAM引擎
R/W > 100: 1 且 update 相对较少;
并发不卨,不需要事务;
表数据量小;
硬件资源有限。

( 2 ) 采用I _ D B 引擎
R /W 比较小,频繁更新大字段;
表数据量超过1000万,并发高;
安全性和可用性要求高。

( 3 ) 采用Memory引擎
有足够的内存;
对数据一致性要求不高,如在线人数和Session等应用;

发表在 mysql | 留下评论

Drupal 删除内容时使用JS弹窗,移出Confirm Form确认

JS:

  1. jQuery(function($){
  2.     $("a.delete, input#edit-delete").bind("click", function(){
  3.         if(!confirm(Drupal.t('Really Delete?'))){return false;}
  4.     })
  5. });

PHP:

  1. function mymodule_menu_alter(&$items) {
  2.   $items['node/%node/delete']['page callback'] = 'my_node_delete_function';
  3.   $items['node/%node/delete']['page arguments'] = array(1);
  4.   $items['node/%node/delete']['module'] = 'mymodule';
  5.   $items['node/%node/delete']['file'] = 'mymodule.pages.inc';
  6. }

在你的模块目录下面创建mymodule.pages.inc文件.

  1. function my_node_delete_function($node) {
  2.   // Taken from node modules node_delete_confirm submit handler
  3.   node_delete($node->nid);
  4.   watchdog('content', '@type: deleted %title.', array('@type' => $node->type, '%title' => $node->title));
  5.   drupal_set_message(t('@type %title has been deleted.', array('@type' => node_type_get_name($node), '%title' => $node->title)));
  6.  
  7.   // Do a drupal goto here to preserver the 'destination' parameter
  8.   drupal_goto();
  9. }
发表在 Drupal | 留下评论

Drupal 的错误和异常处理

在includes/bootstrap.inc文件的_drupal_bootstrap_configuration函数中可以看到Drupal 自定义了错误和异常的处理函数

  1. function _drupal_bootstrap_configuration() {
  2.  // Set the Drupal custom error handler.
  3.  set_error_handler('_drupal_error_handler');
  4.  set_exception_handler('_drupal_exception_handler');
  5. ……

Drupal 使用了_drupal_error_handler和_drupal_exception_handler函数来分别处理错误和异常.

发表在 Drupal, Drupal 函数 | 留下评论

PHP 对部分代码使用不同的错误级别

通常情况下我们可以设置整个项目的错误级别. 但是有时我们可能只想某部分代码使用不同的错误级别

  1. // 设置PHP报错级别
  2. error_reporting(E_ALL);
  3.  
  4. // 使用ini_set来设置
  5. ini_set('error_reporting', E_ALL);

设置部分代码的错误级别

  1. // 获取当前错误级别.
  2. $errorlevel=error_reporting();
  3.  
  4. // 设置新的错误级别
  5. error_reporting($errorlevel & ~E_NOTICE);
  6.  
  7. // my some code.
  8.  
  9. // 将错误级别设置成原来的
  10. error_reporting($errorlevel);
发表在 PHP | 留下评论

GIT 无法强制提交

GIT进行强制推送一些冲突的时候发生了这样的错误

zhouitpro@localhost ~/www/project $ git push dev2 master -f
michael@192.168.0.109's password: 
Total 0 (delta 0), reused 0 (delta 0)
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
To root@192.168.0.109:/home/root/repos/demo.git
 ! [remote rejected] master -> master (non-fast-forward)
error: 无法推送一些引用到 'root@192.168.0.109:/home/root/repos/demo.git'

进入到服务器的仓库目录, cat config文件显示

[receive]
	denyNonFastforwards = false 

denyNonFastforwards 这个选项大概的意思就是你推送一个冲突的版本时会拒绝
替换成. 不过这样也有一定的危险度

[receive]
	denyNonFastforwards = false 
发表在 Git | 留下评论

GIT 共享仓库

通常在创建GIT仓库的时候都会遇到一些权限问题,特别是多问题访问的时候. –shared参数是共享仓库

  1. git –bare init –shared

如果仓库已经创建好了也可以直接进入到仓库目录,修改config文件

  1. [core]
  2.  sharedrepository = 1
发表在 Git | 评论关闭

Ubuntu 配置SSL+Apache

启用ssl 模块, 并且重启Apache

  1. sudo a2enmod ssl
  2. sudo service apache2 restart

创建SSL密钥和证书保存的目录

sudo mkdir /etc/apache2/ssl

生成一个证书

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt

获取一个免费的有效证书https://www.startssl.com/
参考文章:http://blog.nicky1605.com/the-free-ssl-configuration-startssl-on-nginx.html

配置Apache:

  1. sudo vim /etc/apache2/sites-available/default-ssl.conf

以下分别指向你的证书文件

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
发表在 ubuntu | 评论关闭

shadowsocks使用Google时会自动跳转到ipv6.Google.com

编辑vim /etc/sysctl.conf, 增加以下几行到尾部

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
发表在 其它 | 评论关闭

PHP中的Cookie与Session

Cookie

Cookie的创建
在PHP中你可以使用以下代码创建一个Cookie

  1. setcookie(key, value);

根据上面的代码很多同学可能认为cookie是由PHP创建的, 其实不然. PHP不能创建Cookie也没有权限创建,Cookie是由浏览器创建的,当你运行了上面这样一段代码以后. 实际上只是向浏览器返回了一个头信息”Set-Cookie”, 然后最终由浏览器创建. 将Cookie保存在本地.

Cookie如何与服务器交互
当你访问一个已经创建了Cookie的网站,浏览器会根据它的规则找出当出前网站的Cookie. 然后将Cookie发送给浏览器(User-agent). 这里请注意,当你创建的Cookie越大时占用的带宽越多. 所以Cookie尽量是有用的数据.

Cookie 并非那么不安全, 都是代码写得不够严谨而已, Cookie最怕的就是客户端使用Javascript代码去读取和修改Cookie, 但是这里也有参数可以做限制. setcookie函数的第6个参数secure默认是False, 如果设置成True以后Javascript是无法读取你设置的Cookie的.

提问: 如果将你浏览器里面的Cookie文件Copy到我电脑上面并且使用相同的浏览器去访问相同的网站时. Cookie会生效吗?
答: 是的, 这就是所谓的Cookie劫持, 所以在生成Cookie的时候可以加上IP, UA等特殊效验信息.

Session

Session就是会话, Session默认也是以文件的形式保存在服务器. 请查看php.ini 里面的 session.save_path
Session由Cookie而生, 没有Cookie就没有Session. 所以Session依赖于Cookie.

Session的生成与交互
当你的服务器运行了以下代码以后,你会看到你会多了一条类似于这样的Cookie: PHPSISSID=xxx

  1. session_start();

对. 没错. Session就是靠着这条COOKIE与服务器上生成的SESSION产生关联的,当你的网站服务器启用SESSION以后.浏览器每次都会向服务器发送一条这样的COOKIE信息,然后服务器再根据PHPSISSID的值去找到对应的session文件,然后将文件读取出来. 这就是COOKIE和SESSION的关系.

当一个目录下面的文件大于2000个以后,查找这个目录就会变得非常漫, 所以SESSION太多也会导致速度漫. SESSION默认是保存成文件的形式的, 这只是默认. 我们还可以定义将SESSION保存到数据库(Drupal就是这样干的,请参考includes/session.inc的drupal_session_initialize函数), 参数函数: http://cn2.php.net/manual/en/function.session-set-save-handler.php
Drupal的session保存在sessions表里面

发表在 PHP | 评论关闭