PHP脚本没有理由突然停止工作

Osa*_*Osa 6 php mysql linux apache shell

我正在运行一个大的PHP脚本,它可能需要一整天才能完成它的工作,
这个脚本从MySQL数据库中获取数据并使用它与curl来测试东西..它用大约40,000条记录
来做.. 所以要做到这一点只要它需要在后台运行,我使用终端执行它..在PHP脚本本身它有这些设置,以确保它运行尽可能长,直到它完成:

set_time_limit(0); // run without timeout limit
Run Code Online (Sandbox Code Playgroud)

因为我从另一个单独的PHP脚本执行它我使用此功能

ignore_user_abort(1); // ignore my abort
Run Code Online (Sandbox Code Playgroud)

因为直接从命令行执行它,它会给我两个选择..
1)等到脚本完成
2)取消整个过程

搜索之后,有一篇文章给了我第三个选择,它可以通过创建一个外部PHP脚本在后台使用此函数来执行主要的BIG PHP脚本,从而在后台运行它.

exec("php bigfile.php");
Run Code Online (Sandbox Code Playgroud)

这意味着我可以正常从浏览器打开这个外部页面并毫无顾虑地退出它,因为ignore_user_abort它将保持在后台运行.. 这仍然不是问题

问题是......在一段不知名的时期后,脚本停止工作...... 我怎么知道?我告诉它在外部文件中写入它所处理的每个记录的当前日期时间,所以我每次刷新到该外部页面以查看它是否停止更新,

在一个不知名的时期之后,它实际上没有任何理由停止,剧本没有任何说停止或任何东西......如果发生任何错误,我告诉它跳过记录(没有错误发生,他们都在同一行,如果一个工作然后所有应该工作)

但是我的主要疑虑如下:

  • Apache有一个超时可以杀死它
  • 这不是在后台执行PHP脚本的正确方法
  • 某处有一个超时,无论是在PHP还是Apache或者(MySQL!?)
    ,这是我最大的疑问.MySQL,它会不会停止向PHP循环提供记录while?如果发生错误,它会崩溃整个脚本吗?在崩溃整个脚本的任何事情上是否有任何超时?

如果没有一个可以应用它,有没有办法记录脚本现在正在发生什么?或者为什么会崩溃?记录所有内容的详细方法?


更新:

我在messages文件中找到了这个/var/log/:

Dec 29 16:29:56 i0sa shutdown[5609]: shutting down for system halt
Dec 29 16:30:14 i0sa exiting on signal 15
Dec 29 16:30:28 i0sa syslogd 1.5.0#6: restart.
Dec 29 16:50:28 i0sa -- MARK --
            .....
Dec 29 18:50:31 i0sa -- MARK --
Dec 29 19:02:36 i0sa shutdown[3641]: shutting down for system halt
Dec 29 19:03:11 i0sa exiting on signal 15
Dec 29 19:03:48 i0sa syslogd 1.5.0#6: restart.
Run Code Online (Sandbox Code Playgroud)

它说系统暂停..我会尽量确保这可能是在未来的崩溃和匹配时间,这可能导致它?为什么?memory_limit是128M而我有2GB服务器内存RAM,这可能是吗?

PS:我手动重启服务器几次..但是这个说关机并停止?

Mol*_*iel 5

对于这种情况,我使用成功nohup命令,如下所示:

nohup php  /home/cron.php >/dev/null  2>&1 &
Run Code Online (Sandbox Code Playgroud)

如果脚本正在运行,您可以在此之后检查:

jobs -l
Run Code Online (Sandbox Code Playgroud)

注意:当你使用nohup命令路径时,php文件必须绝对不是相对的.我认为从一个php文件调用另一个php文件只是为了防止执行在完成工作之前停止是不是很优雅.

外部参考:http: //en.wikipedia.org/wiki/Nohup

还要确保脚本中没有内存泄漏,这会使脚本在一段时间后崩溃,因为"内存不足".