【问题标题】:PHP script times out in Apache but not in cliPHP 脚本在 Apache 中超时,但在 cli 中没有
【发布时间】:2011-07-29 13:09:37
【问题描述】:

我有一个 PHP 脚本,大约需要 30 秒才能完成。通过 php cli 运行它时,它会成功完成(回显确认并将相关结果保存在本地文件系统上的文件中)。如果我通过 Apache 运行相同的文件,它似乎超时或什么,大约 30 秒左右后,Firefox 让我下载一个空文件,而不是预期的确认消息(其他浏览器对它的处理不同,但基本上,一些没有按计划进行)。应该在文件系统上创建的文件没有创建。

知道执行时间可能很长,我在脚本的开头设置了set_time_limit(400)

关于如何调试它的任何提示?什么可能导致脚本在 Apache 中超时,但在 cli 中却没有?

【问题讨论】:

  • 您的主机允许 set_time_limit 吗?
  • 当您从命令行运行脚本时,PHP 不会强制执行执行限制。这是从命令行运行 PHP 与作为 (f)cgi 或 apache 模块运行的 PHP 之间的(次要)差异之一。见:php.net/manual/en/features.commandline.php
  • 您的服务器是否有权写入您保存文件的特定位置。
  • 是的,我可以使用同一服务器上的其他脚本将文件写入该位置。 set_time_limit 是允许的,我将其设置为 400,如我的问题中所述。 php.ini 中的 max_execution_time 设置为 insane 2000,系统上只有 1 个 php.ini 文件。
  • 嘿 Salty 给我们一个更新,拜托。你注意到新的答案了吗?

标签: php apache apache2


【解决方案1】:

在这里阅读所有答案和 cmets 后,我相信您的脚本不会超时。

我认为这是你的应用程序崩溃。 apache 进程在您的 cli 没有的受限用户中运行。

也许您正在将文件写入文件夹,但您无权访问(在 apache 用户下)。

我也可能缺少 php 模块。 将 cli php.ini 与 apache php.ini 进行比较。

开启错误记录:

error_log = /tmp/php_error.log
log_errors = 1

也许您在测试环境中,您也可以启用display_errors。 但在生产使用中始终关闭它!

查看日志为什么 php 中止。

您可以使用su 命令在 apache-account 中从 cli 运行 php 脚本。 这可用于检查权限。

【讨论】:

  • 谢谢,试试这个,看看我能得到什么。
【解决方案2】:

除了 php 时间限制之外,cgi 可以超时。 如果您在 apache 中使用 mod_fcgid,您还需要增加那里的时间。

看看manual

我觉得你需要增加FcgidIOTimeout 40

【讨论】:

  • 我似乎没有使用 mod_fcgid - 在文件系统的任何地方都找不到它,并且在任何 apache 配置文件中都没有提到 FcgidIOTimeout。
  • 也许你正在使用 mod_php。您可以在 phpinfo() 中看到您的网关。服务器 API:CGI/FastCGI 和 $_SERVER["SERVER_SOFTWARE"] 显示(见末尾)Apache/2.2.14 (Win32) mod_ssl/2.2.14 OpenSSL/0.9.8k mod_fcgid/2.3.6
  • 也没有检测到 mod_php。在 linux centos 下运行它,顺便说一句。
  • 一些为 centos 显示 mod_fcgi 的手册。要检测您正在使用哪个网关,您可以在 etc 目录(和子目录)中搜索 FcgidWrapper。如果你发现它,你正在使用 fcgi。还可以查看所有 LoadModule 命令。如果有类似 LoadModule php5_module modules/libphp5.so 的东西,那么你正在使用 php 中的 apache 模块。这在 linux 上也很常见。
  • 确实在配置中有LoadModule php5_module modules/libphp5.so 行。除了 php.ini 中的 max_execution_time 和 apache 配置中的 Timeout 之外,还有什么可以设置低超时?
【解决方案3】:

PHP CLI 和 PHP via Apache 使用不同的 php.ini 文件。检查 php.ini 文件中的 Apache 版本并确认 max_execution_time 足够高以满足您的需求。

可以执行phpinfo()获取当前使用的php.ini文件的位置。

【讨论】:

  • 好像系统上只有一个php.ini。
  • @SaltyNuts:请参阅我的更新答案。如果您找到正确的 php.ini 文件,请编辑其 set_time_limit 指令并重新启动网络服务器以查看执行时间限制是否增加。
  • 根据您的指示,我已确认 php.ini 中的 max_execution_time 设置为 2000。我假设您的意思是 max_execution_time 而不是 set_time_limit,因为 set_time_limit 是一个函数,而不是 php.ini 指令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 2017-10-12
  • 2022-11-12
  • 1970-01-01
相关资源
最近更新 更多