0

我编写了一个 PHP 脚本,它从一个站点执行 Web 抓取并解析我的网站的输入。

该脚本由 cronjob 定期驱动,所有内容都托管在共享的 Web 服务器中。

问题是:我的脚本每天终止几次,没有错误消息并且每次都在代码中的随机位置。

该脚本很长,执行 2 个 HTTP Gets 和 4 个 HTTP Posts 到其他国家/地区的网站,每个 HTTP 请求大约需要 3 秒才能完成;它还向/从 MySql 数据库写入文件和 r/w。

在尝试了以下事情后,我被困住了:

1)与我的托管支持(IxWebHosting)交谈 - 他们只是浪费我的时间,否认他们的责任,并建议我将 cronjob 定期限制为最大 5 分钟速率(之前是 3 分钟间隔,但它没有改变任何东西。)

2) 我没有从 cronjob 上下文运行,而是切换到以下方法:Cronjob 每 5 分钟调用一次“加载器 PHP 脚本”。湾。“加载器 PHP 脚本”使用 HTTP Get 调用真正的 PHP 脚本,并在等待答案之前终止。C。真正的 PHP 脚本执行大约 20 秒的工作(这里是程序在随机位置终止的地方)。

3)在代码的许多地方放置一些日志文件时间戳,以便查看程序每次运行的终止位置 - 这向我展示了程序在代码中的任何地方终止。

4)为了证明这不是我的代码错误,我进行了以下测试:Cronjob 调用另一个加载器 PHP 脚本。湾。PHP 脚本对不同的测试目的 PHP 脚本执行 HTTP 请求,并在不等待响应的情况下终止。C。第二个 PHP 脚本将执行 20 秒的虚拟任务:睡眠一秒并将时间戳写入日志文件 20 次。

结果:测试成功!第二个程序没有失败......这意味着它与我的代码和我正在运行的网络服务器有关 - 但是因为它每次都在不同的地方失败并且每天只有大约 10 次(从 288 次它运行一天)然后我不知道它在哪里(并且没有 PHP 的错误消息)。

在此先感谢,很抱歉描述太长 - 我很乐意应要求提供更多详细信息。

4

3 回答 3

1

您是在记录实际过程,而不是从过程中写入日志吗?例如,您的 cron 工作看起来像:

* * * * * /home/user/myTroublesomeJob.php 2>&1 >/tmp/crash.log

这将捕获进程本身的 stdout/sterr。从父 shell 脚本调用您的脚本可能也是值得的,它可以捕获 PHP 进程退出,并转储退出代码(这将表明核心转储、信号被捕获等)。请参阅此处了解更多信息。

于 2012-12-21T15:01:28.373 回答
0

尝试在脚本开始时设置超时。

set_time_limit(1800); 

我最近发现,如果我手动运行一个脚本,它运行良好,但如果它由 Cron 运行,它会抛出超时错误。设置此限制有所帮助。

于 2012-12-21T15:06:51.463 回答
0

如果您在共享服务器上运行脚本,那么它将不允许您运行长时间运行的脚本。

如果您的脚本需要时间,请使用专用服务器。因为在共享服务器中,许多用户正在使用共享资源,所以服务器会自动终止使用额外资源的脚本。

..我会建议你使用亚马逊 EC2 免费包。在那里您将能够运行长时间运行的脚本。

谢谢

于 2013-04-13T11:08:37.710 回答