如何提高PHP超过HTML速度?

时间:2009-09-30 09:54:14

标签: php html performance memcached scalability

我有一个PHP文件,它从Memcached获取HTML并将其提供给用户。当我这样测试时:

  

ab -n 1000 -c 100 http://website.com/test.php

每秒发出22个请求。

但是当我将相同的HTML放到HTML文件中并进行此测试时:

  

ab -n 1000 -c 100 http://website.com/test.html

我每秒得到4500个请求。

我需要坚持使用PHP,因为我第一次需要生成HTML,下次我只是从Memcached获取生成的HTML。此外,HTML I显示对于每个其他用户是不同的(基于$ _GET ['user_id']值识别)。有没有办法让RPS更高?更接近于提供纯HTML?

我使用lighttpd作为网络服务器。

4 个答案:

答案 0 :(得分:3)

思想链(待续......):
首先,我将测试问题是由并发性引发还是由于并发性显着恶化。通过-n 1000 -c 100测试,您的比率为22/4500。那么-n 1000 -c 10-n 1000 -c 1呢?

然后我会再次尝试相同+跟踪内存消耗,磁盘I / O和CPU使用情况。这中的任何一个明确是限制因素吗?

然后我会测试简单的PHP脚本:

  • 一个空脚本
  • <?php echo'x';
  • 根本没有脚本,但test.html的内容已复制到test.php
  • 仅提供小型Memcached项目。尽可能简单的脚本,构造Memchached对象并获得一个项目,没有测试,没有过期,没有添加,只有echo $mc->get(string $key)

这些与test.html相比如何?

编辑:

让我们以Web Server Performance Comparison: LiteSpeed 2.0 VS作为比较点。基准测试是针对另一个“竞争对手”的网络服务器产品进行的,但暂时让我们假设他们不是(太)偏见; - )

他们有一个

  • CPU:单个Intel Xeon 2.4 GHz / 533 MHz FSB / 512 KB二级高速缓存
  • 内存:256 MB ECC PC2700
  • 硬盘:36 GB 10K RPM SCSI硬盘希捷ST336607LW
  • NIC:搭载英特尔PRO / 1000千兆位适配器

lighthttpd每秒提供15475个文件,每秒100个字节,脚本helloworld.php每秒1593次,phpinfo.php每秒399次(两个FastCGI)。这是~1:10(你好世界)或1:40(phpinfo)的比例。 “你的”比例为22:4500~1:200。甚至更奇怪的是,当剧本改变时它不会改变。你的“真实”脚本或空的PHP脚本,无论如何始终是1:22。这引起了“陌生因素”(即使测试不相同)。

首先,我会仔细检查PHP是否使用FastCGI支持进行编译,请参阅http://www.fastcgi.com/docs/faq.html#PHP。 然后我用测试中提到的简单的C / C ++ FastCGI程序测试“my”lighthttpd,这是一个真正简单的“hello world”。 http://www.fastcgi.com/devkit/doc/fastcgi-prog-guide/ch2c.htm#4263有一个例子。如果它“很好”,即明显优于PHP FastCGI,我会尝试使用“勉强运行”的PHP版本,即使用--disable-all进行编译,只有那些模块(重新)激活并内置于是必要的启动PHP并让它打印“你好世界”。也使用默认的php.ini。这会改变任何吗?

答案 1 :(得分:3)

比脚本更快?

尝试编写纯HTML文件并提供服务。并创建一个“更新程序”脚本,不时更新您的HTML文件,或者如果您确实需要这样的速度,请创建某个事件。

尝试在某些地方使用SSI,看看效果如何(http://httpd.apache.org/docs/1.3/howto/ssi.html)。

尝试使用Eaccelerator(http://eaccelerator.net/)或APC(http://www.php.net/apc/)来加速脚本解析器,但它不会对PHP5产生奇迹......

确保物理服务器有足够的可用资源(FAST硬盘,大量RAM,多处理器)。

您的脚本比HTML页面慢,这是很正常的:)提供HTML页面意味着简单的文件副本。 PHP脚本意味着初始化脚本引擎,缓存,解析类,函数,内存分配,会话锁定/解锁并保存,从Memcached服务器读取,读取配置文件。对于每个请求。

答案 2 :(得分:2)

您可能还想考虑在PHP服务器前放置一个HTTP缓存。这将减少Web服务器的负载,并将为您重新发送以前呈现的页面。

例如,请参阅Varnish。另一个选项是Squid

显然,如果您使用共享主机,这些不是选项 - 在这种情况下,渲染到.html文件是一个很好的解决方案。

答案 3 :(得分:1)

您可以尝试(伪代码):

if file myfilecache/$user_$request_$today.html does not exist 
then do
     format page 
     write page to myfilecache/$user_$request_$today.html
done
redirect to myfilecache/$user_$request_$today.html

文件系统make是一个非常好的缓存,而lightpd将完成提供页面的实际工作。