【问题标题】:Cronjob timing out with internal server errorCronjob 因内部服务器错误而超时
【发布时间】:2011-06-21 05:06:49
【问题描述】:

我的托管服务提供商只允许我每 2 小时运行一次 cronjob。因为我需要它每秒运行一次,所以我制作了一个可以运行 2 小时的页面。另外,我是用 ZF 开发的;所以页面需要被引导,这意味着 cronjob 需要调用一个网址。

到目前为止,我的 bash 脚本每两个小时运行一次:

#!/bin/bash

wget "http://www.mysite.co.za/ajax/cron"

但是,它会在几分钟后停止并出现以下错误:

--2011-02-04 09:32:32--  http://www.mysite.co.za/ajax/cron
Resolving www.mysite.co.za... 123.40.97.157
Connecting to www.mysite.co.za|123.40.97.157|:80... connected.
HTTP request sent, awaiting response... 500 Internal Server Error
2011-02-04 09:37:33 ERROR 500: Internal Server Error

我对 cronjobs/bash 脚本了解不多,但我认为它正在超时?谁能证实这一点?如果是这样,我将研究 curl_mutl_init 以发回响应并同时保持进程处于活动状态 - 我认为我无法访问进程控制功能。

如果有人有任何提示/建议,请不要犹豫。

【问题讨论】:

  • 您是否有权访问 (Apache) 网络服务器的错误日志文件?应该记录特定的错误。
  • 如果您每秒运行一次作业,则很可能在任何给定时间您都有多个进程在执行相同的操作,因为可以想象,一项作业可能需要一秒钟以上的时间才能完成。您是否正确管理锁定?
  • @initall,不,没有这样的日志文件。我也无权更改 apache 设置。
  • @tim,我不太清楚你所说的锁定是什么意思。这个过程非常小,不超过100ms。我目前运行一个函数循环;进行检查,然后休眠 900 毫秒。我只需要它连续执行 2 小时/7200 次而不会中断。

标签: php bash zend-framework timeout cron


【解决方案1】:

几个 cmets 观察结果:

1.引导

使用引导程序的 ZF 任务不需要通过 HTTP 请求来完成。您可以运行使用引导程序的命令行任务。

在您的 my_script.php 中 - 通常放置在目录 scriptsapplication/scripts 中 - 您可以从与 Web 应用程序的 index.php 文件中的大部分内容相同的内容开始:检查/设置 include_path,检查/设置APPLICATION_ENV,检查/设置APPLICATION_PATH,并实例化您的Zend_Application 对象。

唯一的区别是您拨打$application->bootstrap(),但不要继续拨打$application->run()。事实上,由于某些自举资源可能只需要 web 应用程序,您可以调用:

$application     
    ->bootstrap('necessaryResource1')  
    ->bootstrap('necessaryResource2')
    ->bootstrap('necessaryResource3');`

因此您不会引导不需要的资源。

然后继续执行你的任务的细节。

2。命令行

如果您希望将脚本设计为接受参数,您可以使用Zend_Console_GetOpt。挺好看的。

3.每秒一次?

当然,我不知道您的用例或您的具体需求,但每秒运行一次工作对我来说确实很重要。是否可以将其中一些任务放入队列并以您的主机允许的频率使用队列?

希望这会有所帮助!

【讨论】:

  • 感谢您的详细解答。我不太关心调用脚本时会发生什么/引导,因为它只调用一次,并且我在 2 小时内重复该函数 7200 次。不需要参数,虽然听起来不错。我只需要欺骗服务器,让它认为它已经完成,而它还没有完成。
  • 大卫的回答做得很好,我要补充一点,绝大多数服务器对 PHP 都有执行时间限制,通常在 5 分钟左右(因为 5 分钟对于单个脚本来说是很长的时间)运行)。
  • @Tjorriemorrie:确实,这两个想法:(1)一个非常长时间运行的脚本(比如,两个小时)和(2)一个高频脚本(比如,每分钟一次),让我震惊可能会出现问题,尤其是在共享主机上。你确定你需要那种即时反馈吗?如果目的是为您的标准请求创建某种最新的环境,为什么不能在请求本身期间计算它们所需的数据?
【解决方案2】:

无论您使用什么后端服务器端脚本,要求它运行无限时间或忽略用户中止。

您的网络服务器也可能有一些设置来增加超时时间。(Apache 有它,我已经使用了这个功能)

【讨论】:

  • 如果他只能每两个小时运行一次cron,那我怀疑他可以改变服务器上的超时设置。
  • @Aatch:你认为他无权访问服务器配置?没有办法从php本身设置它吗? :)
【解决方案3】:

如果您有一个需要每秒运行的 cron,最好使用页面加载来触发您的脚本。所以每次有人请求一个新页面时,它都会运行脚本。无论如何,Cron 不能以任何少于一分钟的间隔运行。

你也可以写一个php脚本,代码如下

连续的.php:

while(true){
     sleep(1); //pause 1 second
     exec("wget http://youraddress.com");
}

bash 脚本来查看你的 php 脚本是否正在运行

checkContinuous.sh

#!/bin/sh
#check if script is running
CHECK=`ps -ef |grep continuous.php`;
if [ -z "$CHECK" ]; then
#script not running, start it
   php /path/to/continuous.php& ; #start script and fork it
fi;

希望有帮助!

【讨论】:

  • 你的功能有点像我正在做的事情。我确实需要它每秒运行一次;并且每秒不超过一次,因此我不能依赖请求。感谢您的建议。
  • 你可以把上面的代码放在一个 php 文件中,然后在你的主机命令行上运行它。然后设置另一个脚本来检查您的 php 文件是否仍在运行,如果没有则重新启动它。这样,如果它在主机允许的 2 小时内死亡,它就会开始运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
相关资源
最近更新 更多