Php 脚本在一段时间后不断消失,而不是超时/内存问题

Php 脚本在一段时间后不断消失,而不是超时/内存问题,php,apache,Php,Apache,我有一个长期运行的脚本,它会无缘无故地消失。它应该运行8个多小时,但一两个小时后就消失了,没有错误,什么也没有。我试着通过CLI和http运行它,没有区别 我设置了以下参数: set_time_limit(0); ini_set('memory_limit', '1024M'); 我一直在监控内存的使用情况,它不会超过200米 还有什么我不知道的吗。为什么它会消失?Apache也有自己的脚本超时,您需要调整httpd.conf文件一种可能的解释是PHP垃圾收集器正在干扰脚本。这可能就是你看到随

我有一个长期运行的脚本,它会无缘无故地消失。它应该运行8个多小时,但一两个小时后就消失了,没有错误,什么也没有。我试着通过CLI和http运行它,没有区别

我设置了以下参数:

set_time_limit(0);
ini_set('memory_limit', '1024M');
我一直在监控内存的使用情况,它不会超过200米


还有什么我不知道的吗。为什么它会消失?

Apache也有自己的脚本超时,您需要调整httpd.conf文件

一种可能的解释是PHP垃圾收集器正在干扰脚本。这可能就是你看到随机死亡的原因。当垃圾收集器打开时,只要根缓冲区运行满,就会执行循环查找算法

各国:

能够打开和关闭机制以及自己启动循环收集的基本原理是,应用程序的某些部分可能对时间非常敏感

您可以尝试使用
gc\u disable
禁用PHP垃圾收集器。手册建议您在禁用之前立即调用
gc\u collect\u cycles
,以释放缓冲区

另一种解释可能是代码本身。一个8小时的脚本是一个很长的脚本,如果它很复杂,它很容易遇到一个导致脚本退出的障碍。我认为对于您现在的故障排除,您肯定应该使用
error\u reporting(-1)将错误报告转变为报告所有内容

此外,如果您的脚本正在与其他服务(例如数据库)通信,那么很可能就是这个问题。如果数据库服务器内存不足或超时,则可能会导致脚本挂起并死亡。如果是这种情况,您可以分割与数据库的连接,并在脚本期间以特定的时间间隔连接/断开连接,以保持该连接的新鲜。同样的心态也适用于您可能正在使用的任何其他服务

仅出于测试目的,您可以有目的地使脚本在每次成功查询时写入日志文件,确保包含查询开始时的时间戳和查询结束时的另一个时间戳。您可能不会得到任何错误,但它可以帮助您确定查询是否存在特定问题,或者查询挂起的时间是否比平常长。您还可以检查以确保您的MySQL连接仍然有效,并打印一些信息来通知您

示例日志文件:

[START 2011/01/21 13:12:23] MySQL Connection: TRUE [END 2011/01/21 13:12:28] Query took 5s
[START 2011/01/21 13:12:28] MySQL Connection: TRUE [END 2011/01/21 13:12:37] Query took 9s
[START 2011/01/21 13:12:39] MySQL Connection: TRUE [END 2011/01/21 13:12:51] Query took 12s

很可能与代码有关

我有脚本运行数周和数月没有任何问题

数据库连接可能超时并出现输出错误。 如果打开连接或文件,也可能会耗尽文件描述符。或者您的共享内存区域已满。这取决于代码

查看系统日志,确认selinux没有打扰您。这样,脚本就不会打印任何错误。从系统日志中,您还可以看到您是否已经跨越了任何系统资源的用户限制(请参阅ulimit)

如果在cli中运行它却什么都没有得到,甚至连SEGFULT都没有,这真的很奇怪。你看到了stdout和stderr

也许会有结果。 尝试以以下方式启动脚本:

$ ulimt -c unlimited
$ php script.php

并查看当核心转储文件(core.xxxx)死机时,是否在运行目录中找到该文件

当您提到“无错误”时,该文件是否包括日志文件?您在哪个平台上运行脚本?win/linux?@andre:是的,
error\u log('test')
将输出到这些日志文件,但是当脚本消失时,我不会收到任何错误。可能只有我一个人-但这不是PHP应该使用的方式-现在是吗?@Hannes PHP CLI的要点是它可以以这种方式使用。但是,我同意这样的脚本不应该通过Apache运行。有一些非常好的观点。使用E_ALL打开错误日志记录。但我没有看到任何错误。我将通过禁用垃圾收集进行测试。另外,如何检查当前的数据库超时设置?我正在使用mysql。老实说,我不能告诉你如何检查你的mysql设置,因为我没有使用mysql的一对一经验。我自己做的一些研究表明,如果你可以访问MySQL安装的配置面板,可能有办法延长超时时间。你能找出你的问题是什么吗?