IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

加速PHP的ECHO

风雪之隅 2011-02-13 21:04:21 累计浏览 3,925 次
本机暂存

     我在之前的文章中, 已经解释过了原因, 也希望能纠正”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对资源的占用时间, 增加资源的占用率.

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 使用gettext来支持PHP的多语言 (累计阅读 39,271)
  2. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,165)
  3. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,409)
  4. 记录一个软中断问题 (累计阅读 16,957)
  5. Go Reflect 性能 (累计阅读 14,158)
  6. 我的PHP,Python和Ruby之路 (累计阅读 13,150)
  7. 在Apache2.2.XX下安装Mod-myvhost模块 (累计阅读 13,059)
  8. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,791)
  9. 15个最好的免费开源电子商务平台 (累计阅读 12,542)
  10. Redis消息队列的若干实现方式 (累计阅读 12,088)