我有一个动态cron计划模块。使用该模块,用户可以设置一个cron。基本上有很多用户想要导出的数据库字段。因此,用户可以选择要导出的字段并安排cron。
为了管理所有这些动态crons,我有一个静态cron,它将每小时运行并检查是否有任何动态cron运行,如果cron发现它将执行那些crons。
现在有很多crons,所以我使用了一种黑客来同时运行所有的crons。
<?php
public function actionCrondynamic()
{
while(ob_get_level()) ob_end_clean();
header('Connection: close');
ignore_user_abort();
ob_start();
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
$AllDynCronmodel = Cron::model()->findAllByAttributes();
foreach($AllDynCronmodel as $mk=>$SingleCronModel)
{
$CronId=$SingleCronModel->id;
if(is_numeric($CronId))
{
$curl_url = $this->createAbsoluteUrl('cron/runcron') . "&id=$CronId";
$chu = curl_init();
curl_setopt($chu, CURLOPT_URL, $curl_url);
curl_setopt($chu, CURLOPT_FRESH_CONNECT, true);
curl_exec($chu);
curl_close($chu);
}
}
}
public function actionRuncron($id)
{
/* close connection start */
while(ob_get_level()) ob_end_clean();
header('Connection: close');
ignore_user_abort();
ob_start();
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
/* Close conncetion End */
set_time_limit(7200);
//Other code
//........................
//........................
}
?>
现在有很多复杂的数据。所以大多数复杂的crons需要20-60分钟。所以假设有30个动态crons,那么将会有30个僵尸进程被创建。现在问题是有些时候多达10多个crons无法完成执行,我无法找到原因。
当僵尸进程自动终止时有限制吗?或某种瓶颈或其他什么?
注意:我使用的是innodb mysql引擎。