Heim  >  Artikel  >  Backend-Entwicklung  >  PHP erhält den Implementierungscode der Hintergrundjobverwaltung

PHP erhält den Implementierungscode der Hintergrundjobverwaltung

高洛峰
高洛峰Original
2016-11-30 10:22:12954Durchsuche

复制代码 代码如下: 
Klasse Controller_Jobs erweitert Controller_Base{ 
öffentliche Funktion before(){ 
parent::before(); 
if(Request::$protocol != "cli"){ 
die("Nur cli erlaubt!n"); 


public function after(){ 
parent::after(); 
//einige Reinigungsaufgaben erledigen 

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 command:“.$php_exec.“n“; 
pcntl_exec($php_exec,$command_args); 

/* 
* Jobs in Warteschlangen ausführen 
*/ 
public function action_run(){ 
$requestCount = 0; 
while(true){ 
$sql = "wählen Sie * aus der Jobwarteschlange aus, wobei Status='1' und genehmigt='1' nach ID sortiert sind"; 
$jobs = DB::query(Database::SELECT,$sql)->execute()->as_array(); 
if($jobs){ 
foreach ($jobs as $job){ 
$requestCount ++; 
//Aktualisieren Sie den Auftragsstatus als ausgeführt 
DB::update('job_queue')->set(array('status'=>'2')) 
->where(' id','=',$job['id'])->execute(); 
$job_pid = pcntl_fork(); 
if($job_pid == -1){ 
die("Child konnte nicht geforkt werden"); 
} else if($job_pid == 0 ){ 
$this->_execJobCommand($job['job_uri'],json_decode($job['paras'],true)); 
Echo „Beende Childn“; 
exit(0); 
//Jobs hier ausführen 
} else{ 
echo „Waiting for jobn“; 
ob_flush(); 
$child_pid = pcntl_waitpid($job_pid,$status, WUNTRACED); 
echo „waitpid end:“.$status.“n“; 
if($status == 0){ 
//Job abgeschlossen 
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 „Ruhe dich aus, ich habe 10 Jobs bearbeitet“; 
Ausgang; 

//Kein Job zum Ausführen 
//echo „No jobn“; 
ob_flush(); 
schlafen(5); 



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn