【发布时间】:2016-02-11 06:24:50
【问题描述】:
在将 Apache 与 PHP 一起使用作为模块时,只要 PHP 生成内容就可以输出内容,因为您可以简单地在 PHP 中禁用 output_buffering 并使用 flush() 或implicit_flush(1)。这是我以前用过的,效果很好。
自从切换到 PHP-FPM 后,我遇到了一个问题,在整个脚本完成之前,我无法让 Apache (2.4) 输出 PHP 的内容。我仍然关闭了 output_buffering 并进行了刷新,但这还不够。 Apache 没有使用 mod_gzip(无论如何这也会影响 PHP 模块)。
Nginx 有一个禁用 proxy_buffering 的选项,通过读取其他人的 cmets 可以解决此问题,但我在 Apache 中找不到任何方法。
这是当前在 Apache 中调用 PHP 的方式:
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/"
</FilesMatch>
<Proxy fcgi://localhost/ enablereuse=on retry=0 timeout=7200 max=500 flushpackets=on>
</Proxy>
Apache 文档提到了flushpackets(上面使用过),这似乎是需要的,但它还继续说它目前仅适用于AJS,并非所有代理内容,因此它不会在此执行任何操作案例。
回显足够的空白来填充缓冲区可能会起作用,但这是一个非常不理想的解决方法。
简而言之:有谁知道让 Apache 在回显后立即发送 PHP 内容而不是等到脚本完成的正确方法?
【问题讨论】:
-
您是否在
.htaccess或php.ini中查看过php_value output_buffering Off?在任何一种情况下,如果您不想全局设置,都可以将此命令放在<files>或<VirtualHost>块中。 -
我在第一段中提到 output_buffering 已经设置为关闭(通过 php.ini 全局完成)。
-
抱歉,我看错了那句话。