卡卷网
当前位置:卡卷网 / 技术教程 / 正文

为什么 PHP 中的 echo 很慢以及如何让它变得非常快

作者:卡卷网发布时间:2024-09-09 21:34浏览数量:307次评论数量:0次

您可能已经注意到,回显大量内容的 PHP 脚本似乎运行性能不佳......

为什么 PHP 中的 echo 很慢以及如何让它变得非常快  第1张


嗯,这里的关键词是 “appear”。一个常见的误解是 “echo 是最慢的 PHP 命令”!:p

问题实际上只是带宽问题!当您尝试通过 Internet 推送大量内容时,在某些时候您会体验到“加载时间”......在某些时候,PHP 实际上会经历 “发送时间”!

您可以测量脚本开始和结束之间的执行时间,在连接速度较慢的情况下,它可能会显示执行时间为 500 毫秒。您甚至可以将其缩小到需要 480 毫秒才能执行的单个 echo 语句。但这个时间实际上包括 PHP 无法将更多数据发送回 apache 的等待时间!

有一个常见的技巧,包括在回声之前开始 output befering,如下所示:

ob_start();
echo $a_lot_of_content;


这将允许 PHP 继续前进并看起来快速终止。但事实是,所有内容现在都在 PHP 的输出缓冲区中,尽管您的脚本已完成,但 PHP 仍在后台工作,将所有数据发送到您的 Web 服务器(例如 apache)。

要验证使用此技巧的处理时间是否没有变化,您可以在 apache 中记录实际请求处理时间。

现在,如果你想让 PHP 真正终止,你需要给 Apache 一个更大的缓冲区,以便从 PHP 吸收内容。我相信默认的 Apache 缓冲区是 4096 或 8192 字节(有人知道如何验证这一点吗?

如果您的 PHP 脚本尝试输出 24 KB 的数据,但 apache 只能缓冲 8 KB,那么是的,PHP 将等待。但是,如果您将 Apache 的 cahce 设为 32 KB,那么 PHP 会将其所有数据发送到 Apache 并轻松退出!

以下是在 apache2.conf 中更改 Apache 缓冲区大小的方法:

<IfModule mpm_prefork_module>
StartServers          5
MinSpareServers       5 
MaxSpareServers      15 
MaxClients           40 
MaxRequestsPerChild  20 
SendBufferSize    32768 
</IfModule>

SendBufferSize 行中唯一重要的行。其他行是出于上下文目的,因此您可以在 apache2.conf 中找到正确的位置来添加 SendBufferSize 行(如果它尚不存在)。目前我对其他方面没有特别的建议。

重新启动 apache 后,再次查看您的日志和执行时间。在上面的示例中,您将看到它们从 500 毫秒下降到 30 毫秒。当然,只要你在 PHP 中发送的数据不超过 Apache 缓冲区可以吸收的数据。

现在,当然,这*不会*增加页面从 PHP 到浏览器的端到端传输时间。但是,它将允许 PHP 更快地退出,这可能会也可能不会释放服务器上的资源......可能取决于配置。

我很确定如果您使用 CGI,它确实可以释放资源。但如果你用mod_php,我不知道......任何人?

然后,我猜,下一步将是更快地将数据从 Apache 中推出......但我不确定在 Apache 和管理传输速度的实际 Nagle 算法之间是否有另一个缓冲区可以增强。


END

免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。

卡卷网

卡卷网 主页 联系他吧

请记住:卡卷网 Www.Kajuan.Net

欢迎 发表评论:

请填写验证码