【问题标题】:PHP Script ends before timeout without errorPHP脚本在超时前结束而没有错误
【发布时间】:2012-03-18 18:08:38
【问题描述】:

我有一个 PHP 脚本,它需要至少 1000 秒的执行时间才能完成。

每次大约 265 秒后终止,没有错误。由于我使用的是循环,因此我测试了迭代次数,它与此无关,进一步排除了循环中发生错误的可能性。

我在 php.ini 中将 max_execution_time 设置为 10800,并且更改 memory_limit 也不会影响结果。

请帮忙!我已经彻底挠头了!

【问题讨论】:

  • 你的代码是做什么的?你确定没有抛出错误吗?您是否将错误显示设置为 E_ALL?您没有使用 @ 运算符抑制任何错误吗?
  • 肯定不会出错。你查看过日志文件吗?
  • 您是从命令行、cron 作业、Web 服务器还是其他方式运行它?你尝试过不同的调用方法吗?
  • 另外,请尝试使用 ini_get 函数php.net/manual/es/function.ini-get.php 来确保这些值实际上已被更改!如果他们没有,可能你忘记重新启动 apache,或者编辑了错误的 php.ini 文件。
  • +1 在@didnh 的观点上。如果是 Web 请求,那么您的环境可能设置了 RLimitCPU

标签: php time timeout


【解决方案1】:

您检查过您的日志文件吗?如果您收到错误 6 或分段错误。那么你的脚本实际上是在崩溃 php 而没有在浏览器上显示任何错误(如果它是浏览器而不是 cli)。

如果您在 unix 上使用 apache,那么您应该在 /var/log/apache2/error.log 中找到此日志。

否则你可以在.htaccess中添加这行来定义日志文件的路径:

php_value error_log "/path/to/somewhere/convenient/php_errors.log"

将路径更改为您的 httpd 具有写入权限和读取权限的位置。

【讨论】:

  • 嗯,是的,我猜分段错误将保留在 HTTP 服务器日志文件中。由于php已经崩溃。您是否尝试查看 apache 错误日志?或者您使用的是哪个 HTTP 服务器?
  • 给我的 Plesk 上不允许服务器日志文件。托管服务提供商确认这是由于单个脚本允许使用的最大资源限制。非常感谢您的时间和帮助!
【解决方案2】:

给:

set_time_limit(0);

在脚本的开头。这样代码执行就不会超时,除非它完成。

【讨论】:

  • 我很抱歉无法显示代码...它是一个私人项目..但我已经指定了大部分问题..我已经以不同的方式检查了我的代码..和这很好..对于较小的迭代它工作得很好..
  • @AshishAgrawal set_time_limit 对我有用.. 我有代码可以运行 30 - 40 分钟而不会超时。显示一些代码可能有助于解决问题
  • 是的,确实它也对我有用。我得到了问题的答案。非常感谢您的时间和帮助!
【解决方案3】:

同样的错误也发生在我身上。我的一个 PHP 函数在没有任何错误发送到 stderr、stdout 或任何其他日志文件的情况下死亡。

发生的事情是我使用了一个由其他开发人员编写的辅助 PHP 脚本,该脚本在我的程序运行的中途将内存限制设置为 512MB。子模块还通过在脚本处理的中途将错误日志设置设置为静默来毒化井。

您可以通过在每次循环迭代中打印出可用于您的 PHP 脚本的 php 系统设置来证明这是否发生在您身上。当下标做坏事时,PHP引擎在垃圾收集器在未来随机点运行后抛出一个fit,然后立即死亡而没有错误。当垃圾收集器正在工作时,子模块与系统设置混淆时,这是 PHP 垃圾收集器中的一个错误。

解决方案:编辑 php 帮助子模块,并确保它们不会调整系统设置,因为垃圾收集器正在执行它的工作。 PHP 系统变量中毒后,PHP 解释器会在随机间隔内无任何错误或输出而崩溃并死掉。

【讨论】:

    【解决方案4】:

    在 PHP 上,即使正确指示了 display_errorserror_reporting,从日志中隐藏错误的唯一方法是使用 Error Control Operators

    例如:以下代码会引发致命错误,但会引发“隐藏”错误,它既不会出现在日志中,也不会出现在浏览器上。

    @echo "forgetting the last quote;
    

    因此,将 display_errors 值设置为 On 并将 error_reporting 设置为取决于您使用的 PHP 版本(参见差异here),并检查您是否在代码中使用了“@”符号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-04
      • 2019-04-23
      • 2014-01-25
      • 2014-04-07
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      相关资源
      最近更新 更多