程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP如何獲得job隊列、創建執行進程、等待結束

PHP如何獲得job隊列、創建執行進程、等待結束

編輯:關於PHP編程

       一個後台式 Job 管理實例,流程是:從數據庫中獲得job隊列、創建新的進程進行執行、等待job結束。

      代碼片段:

      class Controller_Jobs extends Controller_Base{

      public function before(){

      parent::before();

      if(Request::$protocol != "cli"){

      die("Only cli allowed!n");

      }

      }

      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."n";

      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 Childn";

      exit(0);

      //run jobs here

      } else{

      echo "Waiting for jobn";

      ob_flush();

      $child_pid = pcntl_waitpid($job_pid,$status, WUNTRACED);

      echo "waitpid end:".$status."n";

      if($status == 0){

      //job completed

      DB::update('job_queue')->set(array('status'=>'999'))

      ->where('id','=',$job['id'])->execute();

      echo "Child Finishedn";

      ob_flush();

      }else{

      DB::update('job_queue')->set(array('status'=>'-1'))

      ->where('id','=',$job['id'])->execute();

      echo "Child Failedn";

      ob_flush();

      }

      }

      }

      }

      else{

      if($requestCount >=10){

      echo "Have a rest, I have processed 10 jobsn";

      exit;

      }

      //no job to run

      //echo "No jobn";

      ob_flush();

      sleep(5);

      }

      }

      }

      }

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved