当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法。按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行,就可以使用这个方法。
with 25 Comments以下是一些PHP Coding Tips. 当然, 这些Tips并不一定仅仅局限于PHP.
大家有什么好的心得, 欢迎直接回复本文与更多的人分享.. 谢谢
本文长期更新, 请关注PHP Coding Tips
最后更新: 2011/04/02
今天同事eddix告诉我发现一个PHP的warning,
$php --re dummy Warning: Internal error: Cannot find extension function Dummy in global function table in Unknown on line 0
以前没有遇到过, 不知道什么意思.
with 5 Comments在上一篇文章Serialize/Unserialize破坏单例的最后, 我留下了一个问题, 为了让大家能思考, 我就单独再写一篇给出答案.
with 12 Comments我们经常采用如下方式定义单列:
class Singleton { private static $instance = NULL; /** 不容许直接调用构造函数 */ private function __construct() { } /** 不容许深度复制 */ private function __clone() { } public static function getInstance() { if (NULL === self::$instance) { self::$instance = new self(); } return self::$instance; } }
很多人都会记得对深度copy的保护, 但, 其实我们却疏忽了一点...
with 15 Comments首先让我们看一个问题: 如下代码的输出,
var_dump(memory_get_usage()); $a = "laruence"; var_dump(memory_get_usage()); unset($a); var_dump(memory_get_usage());
输出(在我的个人电脑上, 可能会因为系统,PHP版本,载入的扩展不同而不同):
int(90440) int(90640) int(90472)
注意到 90472-90440=32, 于是就有了各种的结论, 有的人说PHP的unset并不真正释放内存, 有的说, PHP的unset只是在释放大变量(大量字符串, 大数组)的时候才会真正free内存, 更有人说, 在PHP层面讨论内存是没有意义的.
那么, 到底unset会不会释放内存? 这32个字节跑哪里去了?
你也许注意到过, 在PHP中使用ECHO输出大段字符串的时候, 执行时间会明显的长, 也就会有朋友认为PHP的ECHO性能很差.
我在之前的文章中, 已经解释过了原因, 也希望能纠正"PHP的ECHO性能差"的这个误会.
然而之前的文章, 也仅仅是给出了原因, 并没有介绍如何避免这个问题, 在今天公司内的某个产品线(Apache with PHP)发现了一个问题, 有用户在短时间内大量发起下载请求, 导致http连接数和数据库连接数剧增,
而数据库连接数剧增的原因是因为数据库的连接是单列模式, 一直到请求处理结束, 才会释放数据库链接. 这样就有了一个问题, 如果请求处理时间过长, 就会造成大量的数据库链接存在.
而这个用户的网速很慢,, 下载时间很长~, 这也就意味着, ECHO的"性能"很差~
这也就引出了今天我要谈的这个问题, 如何让ECHO变快, 让PHP的请求处理过程, 尽快结束...
一个同事forward过来一个, 公司某产品线遇到的一个低概率, 但长时间出现了几次的Core的bt信息, 找我帮忙分析下原因.
bt栈如下(路径信息以*代替):
#0 0x00000000004a75e5 in _zend_mm_alloc_int (heap=0xd61260, size=79) at /*/php-5.2.6/Zend/zend_alloc.c:1879 #1 0x000000000048d3cd in vspprintf (pbuf=0x7fbffe9cd8, max_len=1024, format=Variable "format" is not available. ) at /*/php-5.2.6/main/spprintf.c:224 #2 0x0000000000489747 in php_error_cb (type=1, error_filename=0x2a9a787ee8 "/*/application/helpers/util.php", error_lineno=1149, format=Variable "format" is not available. ) at /*/php-5.2.6/main/main.c:799 #3 0x000000000061db35 in soap_error_handler (error_num=1, error_filename=0x2a9a787ee8 "/*/application/helpers/util.php", error_lineno=1149, format=0x7b9cb8 "Maximum execution time of %d second%s exceeded", args=0x7fbffea3b0) at /*/php-5.2.6/ext/soap/soap.c:2178 #4 0x00000000004c2576 in zend_error (type=1, format=0x7b9cb8 "Maximum execution time of %d second%s exceeded") at /*/php-5.2.6/Zend/zend.c:976 #5 <signal handler called> #6 0x00000000004a720f in _zend_mm_free_int (heap=0xd61260, p=Variable "p" is not available. ) at /*/php-5.2.6/Zend/zend_alloc.c:844 ...以下省略with 12 Comments
之前和人讨论过这个问题,,, 今天感冒在家休息, 就回忆了一下, 整理如下.
我们很多的应用在使用Ajax的时候, 大多数情况都是询问型操作, 比如提交数据, 则Ajax只是期待服务器返回:
{status: 0, message:""} //status 0代表成功, 非零的时候, message中包含出错信息.with 46 Comments