Files
preland/admin/bin/worker.php
T
2026-10-25 11:33:56 +03:00

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