PHP 通过反射获取函数的DOC注释

此处使用的是反射中的ReflectionFunction.
参考更多: http://php.net/manual/zh/class.reflection.php

/**
 * THIS IS MY FUNCTION.
 */
function myfun(&$demo, $demo1) {
  return 'demo';
}

$fun = new ReflectionFunction('myfun');

var_dump($fun->getDocComment());
string '/**
 * THIS IS MY FUNCTION.
 */' (length=31)

获得干净的注释信息

$description = str_replace(array("\n", '*', '/'), '', $fun->getDocComment());
var_dump(trim($description));
string 'THIS IS MY FUNCTION.' (length=20)

MYSQL 性能优化

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

show variables like '%slow%';

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

show variables like 'max_connections';

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

MYSQl 数据存储引擎选择

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

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

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

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

JS:

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

PHP:

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

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

function my_node_delete_function($node) {
  // Taken from node modules node_delete_confirm submit handler
  node_delete($node->nid);
  watchdog('content', '@type: deleted %title.', array('@type' => $node->type, '%title' => $node->title));
  drupal_set_message(t('@type %title has been deleted.', array('@type' => node_type_get_name($node), '%title' => $node->title)));

  // Do a drupal goto here to preserver the 'destination' parameter
  drupal_goto();
}

Drupal 的错误和异常处理

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

function _drupal_bootstrap_configuration() {
 // Set the Drupal custom error handler.
 set_error_handler('_drupal_error_handler');
 set_exception_handler('_drupal_exception_handler');
......

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

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

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

// 设置PHP报错级别
error_reporting(E_ALL);

// 使用ini_set来设置
ini_set('error_reporting', E_ALL);

设置部分代码的错误级别

// 获取当前错误级别.
$errorlevel=error_reporting();

// 设置新的错误级别
error_reporting($errorlevel & ~E_NOTICE);

// my some code.

// 将错误级别设置成原来的
error_reporting($errorlevel);

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 

Ubuntu 配置SSL+Apache

启用ssl 模块, 并且重启Apache

sudo a2enmod ssl
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:

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

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

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key