23 lines
1.5 KiB
PHP
23 lines
1.5 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
$jobIndex=array_search('--job',$argv,true);
|
|
// Supervisor не создаёт Imagick: его policy time не должна накапливаться между заданиями.
|
|
if($jobIndex===false)define('PRELAND_ADMIN_SUPERVISOR',true);
|
|
require dirname(__DIR__).'/bootstrap.php';
|
|
$store=new PrelandAdmin\Store();$jobs=new PrelandAdmin\Jobs($store);
|
|
if($jobIndex!==false){$id=$argv[$jobIndex+1]??'';if(!preg_match('/^[a-f0-9]{32}$/D',$id))exit(2);$jobs->run($id);exit(0);}
|
|
$once=in_array('--once',$argv,true);
|
|
do {
|
|
try {
|
|
$id=$jobs->pending();
|
|
if($id!==null){
|
|
$process=proc_open([PHP_BINARY,__FILE__,'--job',$id],[0=>['pipe','r'],1=>STDOUT,2=>STDERR],$pipes);
|
|
if(!is_resource($process))throw new RuntimeException('Не удалось запустить исполнитель.');fclose($pipes[0]);
|
|
$deadline=microtime(true)+max(30,min(900,(int)(getenv('ADMIN_JOB_TIMEOUT')?:300)));$exit=null;
|
|
do{$state=proc_get_status($process);if(!$state['running']){$exit=$state['exitcode'];break;}if(microtime(true)>$deadline){proc_terminate($process);usleep(250000);$state=proc_get_status($process);if($state['running'])proc_terminate($process,9);$exit=124;break;}usleep(100000);}while(true);
|
|
$closed=proc_close($process);if(($exit??$closed)!==0)$jobs->interrupted($id);
|
|
}
|
|
}catch(Throwable){fwrite(STDERR,"Не удалось обработать очередь. Повтор через 2 секунды.\n");}
|
|
if(!$once)sleep(2);
|
|
}while(!$once);
|