长时间运行的MySQL查询在Apache下从PHP运行:浏览器不输出结果并保持“传输数据...”


Long-running MySQL queries run from PHP under Apache: browser does not output result and keeps “Transferring data…”

我有Apache 2.2 PHP 5.3 MySQL 5.5应用程序。第 1 页上的表单.php接受用户输入。使用 GET 将值传递到第 2 页.php。第 2 页上的 PHP 脚本.php运行 MySQL 查询并显示结果。根据用户输入参数,查询可能会运行 3 到 900 秒。

在我的测试中,运行<300 秒的任何查询的结果都显示为 OK。 运行时间较长的查询在服务器上完成正常(我看到 CPU 负载在 90 秒后从 0% 变为 500%),但浏览器没有显示结果并一直显示在状态栏中"正在从 my.host.org 传输数据......"

此时,当我尝试在同一浏览器(Firefox)的新实例中打开应用程序的任何页面时,它显示"正在连接..."在选项卡标题和"等待 my.host.org..."在状态栏中。此时在其他浏览器 (IE) 中打开应用程序的任何页面都可以正常。

以下是到目前为止我已经更改/设置的设置,但它们没有帮助。任何想法都会有所帮助。谢谢。

apache2.conf:
Timeout 300  -> 1800
php.ini:
user_ini.cache_ttl = 300  -> 1800
max_execution_time = 30  -> 1800
default_socket_timeout = 60  -> 1800
mysql.connect_timeout = 60 -> 1800
page2.php: 
ignore_user_abort(1);

考虑到这是一个长时间运行的查询,你真的需要在浏览器窗口中运行它吗?

您应该考虑使用 Cron 作业并将输出重定向到电子邮件地址,默认情况下,在 CLI 中运行的 PHP 进程具有无限的执行时间。

作为我的最后一条帮助,如果您以 (F)CGI 运行 PHP,您可能需要更改 CGI 设置以等待 PHP 进程的输出更长的时间。