我有一个PHP脚本似乎在大约20分钟后停止运行。
为了弄清楚原因,我制作了一个非常简单的脚本,看看它运行多长时间没有任何复杂的代码让我迷惑。
我发现这个简单的无限循环也发生了同样的事情。在运行15到25分钟之间的某个时刻,它会在没有任何消息或错误的情况下停止。浏览器显示“完成”。
我已经完成了我能想到的每一件事:
set_time_limit ( session.gc_maxlifetime in the php.ini)
memory_limit
max_execution_time
脚本停止的点不一致。有时会停在15分钟,有时是22分钟。
请,任何帮助将不胜感激。
它托管在1and1
服务器上。我联系了他们,他们不支持开发人员造成的错误。
答案 0 :(得分:4)
在某些时候,浏览器超时并停止加载页面。如果要测试,请打开命令行并在其中运行代码。该脚本应无限期运行。
答案 1 :(得分:3)
您是否考虑过从命令行运行脚本,例如:
php script.php
让脚本每隔一段时间刷新一条消息,使其仍在运行:
<?php
while (true) {
doWork();
echo "still alive...";
flush();
}
答案 2 :(得分:2)
在这种情况下,我打开php.ini中的所有开发设置,当然是在开发服务器上。这会显示更多消息,包括弃用警告。
根据我调试长时间运行的php脚本的经验,最常见的原因是内存分配失败(致命错误:允许的内存大小为xxxx字节耗尽...)
答案 3 :(得分:1)
我认为你需要知道的是它停止的确切时间(你可以设置一个初始时间并保持倾倒当前时间减去初始值)。服务器端有一些东西正在停止文件。另外,考虑进行ini_get检查以确保执行时间实际为0.如果需要,将时间限制设置为30,然后设置每个循环,继续设置为30.每次调用set_time_limit时,计数器将重置并且这可能允许您绕过实际限制。如果这仍然无法正常工作,1and1的服务器上会有一些东西可能会破坏脚本。
另外,您是否尝试过ignore_user_abort?
答案 4 :(得分:0)
我感谢大家的评论。特别是詹姆斯哈蒂格,你非常乐于助人,并把我送上了正确的道路。 我还是不知道问题是什么。我使用SSH在服务器上运行它,只需使用exec()命令以及ignore_user_abort()。但它仍然会超时。 所以,我只需将它分成几小部分,每部分只运行约2分钟,并使用会话变量/数组来存储我离开的地方。 我很高兴现在完成这个相当简单的项目,并且在1和1时非常生气。哦,好吧......
答案 5 :(得分:0)
我认为这是由某些进程监视器杀掉“僵尸进程”以便为其他用户提供资源所致。
使用“2&gt;&amp; 1”运行exec以记录包括stderr在内的任何内容。
在我的输出中,我设法抓住了这个:
...
script.sh: line 4: 15932 Killed php5-cli -d max_execution_time=0 -d memory_limit=128M myscript.php
所以某事(外部力量,而不是PHP本身)正在扼杀我的过程!
我使用的是IdWebSpace,这是非常好的BTW,但我认为大多数共享托管服务提供商强制要求这种资源/流程控制机制只是为了理智。