4

加速PHP的ECHO

 2 years ago
source link: https://blogread.cn/it/article/3231?f=hot1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

加速PHP的ECHO

浏览:2351次  出处信息
     你也许注意到过, 在PHP中使用ECHO输出字符串的时候, 执行时间会明显的长, 也就会有朋友认为PHP的ECHO性能很差.

     我在之前的文章中, 已经解释过了原因, 也希望能纠正”PHP的ECHO性能差”的这个误会.

     然而之前的文章, 也仅仅是给出了原因, 并没有介绍如何避免这个问题, 在今天公司内的某个产品线(Apache with PHP)发现了一个问题, 有用户在短时间内大量发起下载请求, 导致http连接数和数据库连接数剧增,

     而数据库连接数剧增的原因是因为数据库的连接是单列模式, 一直到请求处理结束, 才会释放数据库链接. 这样就有了一个问题, 如果请求处理时间过长, 就会造成大量的数据库链接存在.

     而这个用户的网速很慢,, 下载时间很长~, 这也就意味着, ECHO的”性能”很差~

     这也就引出了今天我要谈的这个问题, 如何让ECHO变快, 让PHP的请求处理过程, 尽快结束…

     我们知道, 之所以ECHO慢, 是在等待”写数据”成功返回, 那么一个比较简单的办法, 就是打开输出缓存,

ob_start();
echo $huge_string;

     这样, 我们的ECHO就会”立即”执行成功, 返回. 因为数据暂时写到了我们的输出缓存当中.

     但这样并不能解决我们今天遇到的这个问题, 因为这些数据到最后, 还是需要PHP去把它们发送给客户端(此时不考虑WebServer的Output buffer), 这个过程不结束, 请求不会关闭, PHP也不会执行DB的析构函数~

     那么, 既然做梦, 那就再做大点, 我们可以使用Apache的输出缓存.

     假设, 我们的PHP要输出100K的数据, 那么, 我们Apache的的输出缓存就必须大于100K, 否则当Apache的输出缓存满了以后, 就会真正的发送给客户端, 而这个过程中, 当时执行的ECHO就会阻塞等待.

     那么, 如何修改Apache的输出缓存呢? 我们可以在apache的配置文件中:

   StartServers          5
   MinSpareServers       5
   MaxSpareServers      15
   MaxClients           40
   MaxRequestsPerChild  20
   SendBufferSize    32768

     也就是上面的SendBufferSize, 具体的SendBufferSize的说明, 参看http://httpd.apache.org/docs/2.0/en/mod/mpm_common.html#sendbuffersize

     注: 其他的Webserver with php-cgi的模式, 请翻阅相关Webserver的手册, 寻找类似配置.

     现在, PHP的ECHO, 将直接把内容交给Apache, 而内容会在PHP处理完成以后, 由Apache发送给客户端. 从而加速了ECHO的执行效率.

     最后要说明, 这样做, 只是把原来ECHO的等待时间, 转移给了Apache, 并没有真正的减少客户端获取到内容的时间. 它只是加速了PHP的处理过程, 提前了PHP的退出时机, 从而能减少PHP对资源的占用时间, 增加资源的占用率.

建议继续学习:

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK