FastCGI 是一个可伸缩、高速的在web server和脚本语言间通迅的接口。关于FastCGI技术的更多信息可以在官方网站和Wikipedia看到。
FastCGI 被许多脚本语言所支持,包括 php,如果用 –enable-fastcgi 选项编译的话。
多数流行的web server都支持 FastCGI。包括Apache(mod_fastcgi和mod_fcgid),Zeus,nginx和lighttpd。
FastCGI 的主要优点是把动态语言和 web server 分离开来。这种技术允许 web server 和动态语言运行在不同的主机上。这可以改进可扩展性和安全性而没有大的效率损失。
php-fpm 可以和任何支持外部 FastCGI 技术的 web server 一起使用。
很不幸,官方网站 php.net 上的 php 在将 FastCGI SAPI 用于生产环境方面有许多已知的问题。
下面是关于启用 FastCGI SAPI 时的问题和 php-fpm 是如何解决他们的对比列表。
| 描述 | php自带的 | spawn-fcgi + spawn-php.sh + daemontools | php-fpm |
|---|---|---|---|
| php守护进程化: pid file, log file, setsid(), setuid(), setgid(), chroot() | (-) | (+) | (+) |
| 进程管理。可以用 “graceful” 来停止并启动 php worker 进程而不会丢失请求。能够平滑地升级配置和二进制程序而不丢失任何请求。 | php4 (-), php5 (只有 graceful) | (-) | (+) |
| 严格限制来源请求的 web server 的 ip 地址 | php4 (-) php5 (+) (从 5.2.2 开始) | (-) | (+) |
| 根据负载动态调整进程数 | (-) | (-) | Todo |
| 用不同的 uid/gid/chroot/environment 和不同的 php.ini 选项启动 worder 进程。你不需要 safe mode 了! | (-) | (-) | (+) |
| 记录 worker 进程 stdout 和 stderr 日志 | (-) | (-) | (+) |
| 如果使用优化器,在共享内存意外破坏的情况下紧急重启所有的进程 | (-) | (-) | (+) |
| 如果 set_time_limit() 失败,确保进程会结束 | (-) | (-) | (+) |
| 特色功能 Error header、优化的上传支持、fastcgi_finish_request() | |||
PHP-FPM 配置起来很简单,但有一点比较有意思的是如何确定 Worker 的数量。PHP-FPM 作者 Andrei Nigmatulin 在新闻组里提到的小技巧如下:
1) 用 Linux top 命令观察 (这个方式比较土) 2) 用 'netstat -np | grep 127.0.0.1:9000' 收集数据。 设置 php-fpm.conf 中的 max_children 的数值使 等待的数量变为最小。
目前使用 PHP-FPM 还只是通过 Patch 方式,然后编译
有时会遇到批量添加数据的问题,但是如果一条条添加对是不实现的因为有些要添的记录是变动的,用循环要是添加多条又会给MYSQL增加很大压力,下面的方法中用一条SQL就可以实现目的了
//note 得到uid数组
$insertUidsArr = array_diff($inviteIds,$uids);
//note 加入记录
if(count($insertUidsArr)){
$comma = $val = ”;
foreach($insertUidsArr as $insertUids){
$val .= $comma.’(‘.$insertUids.’,’.$uid.’)';
$comma = ‘,’;
}
$db->query(“INSERT INTO {$tablePre}table(uid,to_ids) VALUES $val”);
}
遇到有相同查询字段时,一条一条查会浪费不少资源,使用下面的方法只用一条SQL就可以了
$getTidArr = $db->getAll(“SELECT * FROM {$dbTablePre}user WHERE tid IN (‘$uid’, ‘$toid’)”);
$getMyPk = $getOtherPk = $userTidArr = $getPkArr = $tempUserTidArr = array();
foreach($getTidArr as $tidKey=>$tidVal) {
$tempUserTidArr[$tidVal['tid']][] = $tidVal;
if($tidVal['tag_pk']) {
$getPkArr[$tidVal['tid']] = $tidVal;
}
}
//note 得到第一个想要的信息数组
$getMyPk = $getPkArr[$uid];
//note 得到第二个想要的信息数组
$getOtherPk = $getPkArr[$toid];
1.如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。
2.echo 比 print 快。
3.使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。
4.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。
5.注销那些不用的变量尤其是大数组,以便释放内存。
6.尽量避免使用__get,__set,__autoload。

Categories
Tag Cloud
Blog RSS
Comments RSS
Last 50 Posts
Back
Void « Default
Life
Earth
Wind
Water
Fire
Light 