解决php加载慢的一个办法
正好这两天看到hiphop的文章,所以决定使用它来试一下,最终发现代价太大了,修改一个文件要把整个工程全部编译一次,并且它生成的程序是http协议的,我们现在只是需要一个fastcgi服务器就行了,而且自己写的各种扩展完全无法使用了,所以这条路基本上否定了。
虽然hiphop这条路走不通,但是却给我一个启示,既然造成加载慢的原因是require_once导致的,那干脆写个脚本,把目前的所有代码都merge成一个大的文件不就行了(因为我们的框架是rpc的,因此只有一个入口,index.php,其他的代码里全是class和function,不存在直接的调用逻辑,因此merge以后不会有任何影响)。具体的操作如下:
1、将所有的require_once行删除,换成|空行
2、将文件开头的
3、记录每个文件在merge后的文件里的offset,将这个信息输出在merge后的文件尾,这个是用于修正日志的,因为merge完了之后,日志打印出来的信息都是那个merge完的文件以及行数,这对于线下查日志没有任何帮助,因此需要修改日志输出类,根据merge后的行数对日志进行修正。
做完之后,实际测了一下,发现如果不使用ea的话,框架的消耗基本在3-5ms,如果使用了ea,反而在5-6ms,去看了一下ea的代码,发现原来它是将解析出来的op_array经过分类存储,然后每次调用zend_compile时,再把这些东西重新拷贝再返回,这个过程并不比zend_compile实际去编译快,而且还有许多额外的检查,因此反而不如直接使用php-cgi。
另外在测试时发现php一个很奇怪的现象
class A extends B
{
}
class B{}
这段代码是可以的,
但是
class A extend B{}
class B extend C{}
class C{}
这样的代码就会出错了www.2cto.com
注:后来又测了一下autoload方式,发现比打成一个文件慢很多,在只自动加载一两个类的情况下,某个特定请求需要执行20ms左右,而打成一个只需要5ms左右
摘自 无心云
推荐阅读
-
解决php加载慢的一个办法
-
PHP的一个完整SMTP类(解决邮件服务器需要验证时的问题)_PHP
-
PHP递归返回值时出现的问题解决办法_PHP
-
php关于主机调用虚拟机上的linux服务解决办法
-
php.ini save_handler 修改不生效的解决办法
-
如何解决 PHP 第一次连接Oracle非常慢的问题
-
php 环境本地用ip连接mysql响应快,用localhost连接慢的解决
-
PHP读取mssql json数据中文乱码的解决办法,
-
php history.back返回后表单数据丢失的解决办法,history.back_PHP教程
-
PHP使用Session遇到的一个Permission denied Notice解决办法