PHP簡單寫守護程序、多程序
阿新 • • 發佈:2018-12-09
public function actionSupervise($total_process = 1)
{
Log::info("%s begins", __METHOD__);
if (!Mutex::trylock(self::MUTEX_KEY)) {
Log::info("another supervisor is running.");
return;
}
while (Mutex::isLocked(self::MUTEX_KEY)) {
for($i = 0; $i <$total_process ; $i++) {
$cmd = sprintf("%s/yiic %s run --total_process=%d --current_process=%d >/dev/null & ", Yii::app()->getBasePath(),
self::MUTEX_KEY, $total_process, $i);
exec($cmd, $output, $retCode);
if ($retCode != 0) {
Log::error("mq failed: [%d]", $retCode);
sleep(self::SLEEP_INTERVAL);
}
}
}
Log::info("%s ends", __METHOD__);
}
public function actionRun($total_process = 1, $current_process = 0)
{
Log::info ("mq [%s] process %d begin", __METHOD__, $current_process);
$mutexKey = self::MUTEX_KEY."_".$current_process;
try {
if (!Mutex::trylock($mutexKey)) {
Log::info(sprintf("another %s is running.",$mutexKey));
return;
}
$res = $this->runActualOperation($total_process,$current_process);
if(empty($res)){
Log::info(sprintf("process %d nothing to running.",$current_process));
}
Mutex::unlock($mutexKey);
} catch (Exception $ex) {
Mutex::unlock($mutexKey);
Log::info($ex->getTraceAsString());
}
Log::info("mq[%s] process %d end", __METHOD__, $current_process);
}
public function runActualOperation($total_process,$current_process){
$newMqs = Mq::model()->findNewMqBySlice($total_process, $current_process, self::ITEMS_PER_BATCH);
if (count($newMqs) == 0) {
sleep(self::SLEEP_INTERVAL);
return;
}
foreach ($newMqs as $mq) {
Log::trace("開始處理mq:{$mq->id}");
$this->handleExecute($mq);
}
}