45 lines
948 B
PHP
45 lines
948 B
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
require __DIR__ . '/common.php';
|
|
|
|
const WORKER_IDLE_SLEEP_USEC = 200000;
|
|
|
|
if (PHP_SAPI !== 'cli') {
|
|
fwrite(STDERR, "tcp_worker.php must run from CLI\n");
|
|
exit(1);
|
|
}
|
|
|
|
$lockFp = fopen('/tmp/car_tcp_worker.lock', 'c');
|
|
if ($lockFp === false) {
|
|
fwrite(STDERR, "failed to open worker lock\n");
|
|
exit(1);
|
|
}
|
|
|
|
if (!flock($lockFp, LOCK_EX | LOCK_NB)) {
|
|
fwrite(STDERR, "worker already running\n");
|
|
exit(0);
|
|
}
|
|
|
|
register_shutdown_function(static function () use ($lockFp): void {
|
|
@flock($lockFp, LOCK_UN);
|
|
@fclose($lockFp);
|
|
});
|
|
|
|
db_ensure_tcp_queue_schema(db());
|
|
|
|
while (true) {
|
|
try {
|
|
$job = tcp_queue_claim_next(db());
|
|
if (!$job) {
|
|
usleep(WORKER_IDLE_SLEEP_USEC);
|
|
continue;
|
|
}
|
|
|
|
tcp_worker_process_job($job);
|
|
} catch (Throwable $e) {
|
|
fwrite(STDERR, date('c') . ' ' . $e->getMessage() . "\n");
|
|
usleep(1000000);
|
|
}
|
|
}
|