PHP获得job队列、创建执行进程、等待结束
发布时间:2020-12-13 20:39:22 所属栏目:PHP教程 来源:网络整理
导读:一个后台式 Job 管理实例,流程是:从数据库中获得job队列、创建新的进程进行执行、等待job结束。 代码片段: Copy to Clipboard 引用的内容: [www.veryhuo.com] ?php defined('SYSPATH') OR die('No direct access allowed.'); class Controller_Jobs exte
一个后台式 Job 管理实例,流程是:从数据库中获得job队列、创建新的进程进行执行、等待job结束。 代码片段: Copy to Clipboard <?php defined('SYSPATH') OR die('No direct access allowed.'); class Controller_Jobs extends Controller_Base{ public function before(){ parent::before(); if(Request::$protocol != "cli"){ die("Only cli allowed!"); } } public function after(){ parent::after(); //do some cleaning tasks } private function _execJobCommand($joburi,$paras){ $php_exec = Kohana::config("picsou.php_exec"); $php_index = APPINDEX; $command_args = array(); $command_args[] = $php_index; $command_args[] = "--uri=".$joburi; foreach ($paras as $para => $value){ $command_args[] = "--".$para."=".$value; } //var_dump($command_args);exit; echo "exec commmand:".$php_exec.""; pcntl_exec($php_exec,$command_args); } /* * Running jobs in queues */ public function action_run(){ $requestCount = 0; while(true){ $sql = "select * from job_queue where status='1' and approved='1' order by id"; $jobs = DB::query(Database::SELECT,$sql)->execute()->as_array(); if($jobs){ foreach ($jobs as $job){ $requestCount ++; //update the jobs status as running DB::update('job_queue')->set(array('status'=>'2')) ->where('id','=',$job['id'])->execute(); $job_pid = pcntl_fork(); if($job_pid == -1){ die("Could not fork Child"); } else if($job_pid == 0 ){ $this->_execJobCommand($job['job_uri'],json_decode($job['paras'],true)); echo "finish Child"; exit(0); //run jobs here } else{ echo "Waiting for job"; ob_flush(); $child_pid = pcntl_waitpid($job_pid,$status,WUNTRACED); echo "waitpid end:".$status.""; if($status == 0){ //job completed DB::update('job_queue')->set(array('status'=>'999')) ->where('id',$job['id'])->execute(); echo "Child Finished"; ob_flush(); }else{ DB::update('job_queue')->set(array('status'=>'-1')) ->where('id',$job['id'])->execute(); echo "Child Failed"; ob_flush(); } } } } else{ if($requestCount >=10){ echo "Have a rest,I have processed 10 jobs"; exit; } //no job to run //echo "No job"; ob_flush(); sleep(5); } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |