PHP简单写守护进程、多进程

本文介绍了一个使用Yiic框架实现的任务调度系统,通过Mutex确保并发任务的正确执行,防止资源冲突。系统采用分批处理的方式,提高处理效率,同时通过日志记录关键操作,便于监控和调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    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);
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值