Scripting PHP脚本停止任意运行,没有错误

Scripting PHP脚本停止任意运行,没有错误,scripting,while-loop,php,Scripting,While Loop,Php,我有一个PHP脚本,它似乎在大约20分钟后停止运行 为了找出原因,我制作了一个非常简单的脚本,看看在没有任何复杂代码的情况下它能运行多长时间 我发现同样的事情也发生在这个简单的无限循环中。在运行15到25分钟之间的某个时间点,它会停止运行,不会出现任何消息或错误。浏览器显示“完成” 我已经考虑了我能想到的每一件事: set_time_limit ( session.gc_maxlifetime in the php.ini) memory_limit max_execution_time 脚本

我有一个PHP脚本,它似乎在大约20分钟后停止运行

为了找出原因,我制作了一个非常简单的脚本,看看在没有任何复杂代码的情况下它能运行多长时间

我发现同样的事情也发生在这个简单的无限循环中。在运行15到25分钟之间的某个时间点,它会停止运行,不会出现任何消息或错误。浏览器显示“完成”

我已经考虑了我能想到的每一件事:

set_time_limit ( session.gc_maxlifetime in the php.ini)
memory_limit
max_execution_time
脚本停止的点不一致。有时会在15分钟停止,有时会在22分钟停止

请,任何帮助都将不胜感激


它托管在
1和1
服务器上。我联系了他们,他们不支持由开发人员引起的错误。

在某个时候,您的浏览器超时并停止加载页面。如果要测试,请打开命令行并在其中运行代码。脚本应该无限期运行。

您是否考虑过只从命令行运行脚本,例如:

php script.php
并让脚本每隔一段时间刷新一条消息,使其仍在运行:

<?php

while (true) {
  doWork();
  echo "still alive...";
  flush();
}

我想你需要知道它停止的确切时间(你可以设置一个初始时间,并继续转储当前时间减去初始时间)。服务器端有东西正在停止文件。此外,考虑做一个InIGET检查,以确保执行时间实际上是0。如果需要,将时间限制设置为30,然后每次循环,继续设置为30。每次调用set_time_limit时,计数器都会重置,这可能允许您绕过实际限制。如果此操作仍然不起作用,则1和1的服务器上可能会有某种东西导致脚本死机


另外,您是否尝试过忽略用户中止?

我感谢大家的评论。特别是詹姆斯·哈蒂格的,你帮了我大忙,让我走上了正确的道路。 我还是不知道问题出在哪里。我使用SSH在服务器上运行它,只需使用exec()命令和ignore\u user\u abort()。但它仍然会超时。 所以,我只需要将它分成小块,每个块只运行大约2分钟,然后使用会话变量/数组来存储我离开的地方。
我很高兴现在完成了这个相当简单的项目,我对1和1非常恼火。哦,好吧…

我认为这是由于某些进程监视器为了允许其他用户使用资源而杀掉了“僵尸进程”造成的

使用“2>&1”运行exec以记录任何内容,包括stderr

在我的输出中,我成功地捕捉到了这一点:

...
script.sh: line 4: 15932 Killed                  php5-cli -d max_execution_time=0 -d memory_limit=128M myscript.php
所以有什么东西(外力,而不是PHP本身)正在扼杀我的进程


顺便说一句,我使用了非常好的方法,但我认为大多数共享主机提供商都会采用这种资源/进程控制机制,这只是为了保持理智。

在这种情况下,我会打开php.ini中的所有开发设置,当然是在开发服务器上。这将显示更多消息,包括弃用警告


在我调试长时间运行的php脚本的经验中,最常见的原因是内存分配失败(致命错误:允许的xxxx字节内存大小已耗尽…

我就是这么想的!难道没有办法阻止浏览器这样做吗?给我涂上noob颜色,但是我的1和1主机包是最便宜的,它不支持SSH。。。据我所知,这是通过命令行访问php的唯一方法,不是吗?是的,这基本上是唯一的方法。我可以问你为什么要无限期加载吗?大多数浏览器(除了移动设备)只要你不断地向它们发送数据就可以了。我的无限循环只是为了测试。我实际上试图修复的脚本需要运行大约30或40分钟,但在20分钟后会一直停止。我想知道为什么要用这个。它每隔几秒钟就会回显一小段文字。这不是浏览器保持会话打开所需的数据吗?很难说。这里的信息非常模糊。您的问题可能仍然是PHP中的超时限制,您确定它在超时后仍在运行吗?可能是您的主机公司阻止您在30秒以上运行脚本。有些主机这样做是为了防止CPU/服务器锁定。当用户关闭连接并确保PHP仍在运行时,请阅读并考虑写入文件。是的,我已经完成了所有的超时限制。我联系了1和1,他们告诉我,他们没有任何时间限制。我不认为它在超时后仍在运行。这就是问题所在。。。我的原始脚本将数据添加到数据库中,一旦停止,数据库中就不再显示数据。(顺便说一句,我已经排除了MySQL的问题)您所说的关于写入文件并确保PHP仍在运行。。。那到底有什么用呢?而且。。。我该怎么做?(请原谅我在这里的无礼…)谢谢您可以使用
exec()
生成一个单独的进程。试图通过直接浏览器调用使脚本运行30分钟以上纯属疯狂。您是否可以从服务器访问错误和访问日志?他们可能会给你更多的信息,说明在这种情况下发生了什么。还有,你能在本地重现这个问题吗?就调试而言,这可能会给你更多的选择。不,我没有访问日志的权限。这是一件让我很生气的事。我制作了一个定制的PHP错误日志csv文件,但没有有用的PHP错误:-/我没有在本地测试它,因为它需要很长时间才能找到。我想如果它运行正常,那就是我不知道的某个模糊的服务器设置,或者如果它停止了,那就是我不知道的某个模糊的浏览器问题。不管怎样,都没有多大帮助。不过,我将尝试上面詹姆斯的建议,这似乎很有用。同时还有其他想法吗?在本地运行它可以让您检查服务器日志。是吗