我正在尝试开发一个每5秒检查一次电子邮件的crontab任务。通常情况下,我可以每1分钟而不是5秒钟请求它,但是在没有解决方案的情况下阅读其他一些帖子,我发现其中一个问题与我相同。一段时间后,剧本停止了。这不是一个真正的问题,因为我可以配置一个crontab任务并使sleep(5)
我也有与另一个问题相同的1and1服务器,我在这里包括。
PHP script stops running arbitrarily with no errors
当我尝试通过crontab解决这个问题时,我遇到了一个真正的问题,每分钟创建一个新的PID,所以在一个小时内,我可以同时获得近50个进程。
这里我每分钟都包含crontab调用的.php文件:
date_default_timezone_set('Europe/Madrid');
require_once ( $_SERVER['DOCUMENT_ROOT'] . '/folder1/path.php' );
require_once ( CLASSES . 'Builder.php');
$UIModules = Builder::getUIModules();
$UIModules->getfile();
所以我通过检查PID表找到了解决方案。这个想法是,如果在PID表中运行2个进程,那么这意味着最后一个进程仍在工作,所以只需完成任何操作。如果在PID表中只有1个进程正在运行,这意味着正在运行的最新进程已经过期,因此我们可以使用这个新进程。方式就像我在下一个代码中显示的那样:
$var_aux = exec("ps -A | grep php");
if (!isarray($var_aux)){
date_default_timezone_set('Europe/Madrid');
require_once ( $_SERVER['DOCUMENT_ROOT'] . '/folder1/path.php' );
require_once ( CLASSES . 'Builder.php');
$UIModules = Builder::getUIModules();
$UIModules->getfile();
}
我不确定条件isarray($var_aux)
因为$ var_aux总是返回最后一个PID进程,所以它返回一个28个字符的字符串,但在这种情况下我们想要返回的不仅仅是一个进程所以情况甚至可以改为if (strlen($var) < 34)
。注意:我给了len更多的保证金,导致某个时间过程花费的时间超过9999,所以它的持续时间更长。
我发现的主要问题是exec语句只是打印我的最后一个进程,换句话说,它总是返回一个长度为28的字符串(该脚本的PID)。
我不知道我的目的是否是一个疯狂的想法,但是有可能用php获取所有的PID表吗?
答案 0 :(得分:1)
你可以使用比在php中模拟crontab更简单的解决方案:使用contab 多做一个条目,每5秒检查一次,然后调用你的php程序。
可以在此处找到有关如何设置crontab以执行子分钟操作的详细说明:
https://usu.li/how-to-run-a-cron-job-every-x-seconds
此解决方案每分钟最多只需要12个进程。