// читаем из файла задачу (без блокировки)
$f = fopen('./queue.jobs', 'rb');
$job = fgets($f);
fclose($f);
if ($job) {
$f = fopen('./queue.jobs', 'rb');
// Пытаемся залочить файл
$retries = 1000; // кол-во попыток на открытие файла
do {
if ($retries > 0) {
usleep(rand(1, 10000));
}
} while (--$retries > 0 && !flock($f, LOCK_EX));
if ($retries <= 0) {
echo "Can not lock file", PHP_EOL;
exit(0);
}
// Тут внимание! Читаем еще раз задачу и проверяем
$job = fgets($f);
if ($job) {
// Тут выполняем свою работу
echo "Job: ", $job, PHP_EOL;
// Обновим файлик с задачами (запишем все без верхней строки)
$rows = [];
while ($row = fgets($f)) {
$rows[] = $row;
}
file_put_contents('./queue.jobs', implode(PHP_EOL, $rows));
}
flock($f, LOCK_UN);
fclose($f);
}
flock($f, LOCK_EX | LOCK_NB);
//watchdog for daemon
$f = fopen('./daemon.active', 'rb');
if (flock($f, LOCK_EX | LOCK_NB)) {
$row = (int) fgets($f);
// timeout 3 min
if(($row + 3) < date('Ymdhi')){
ping('http://' . $host . '/daemon.php');
sleep(1);
}
flock($f, LOCK_UN);
}
fclose($f);
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // выполняем эксклюзивную блокировку
ftruncate($fp, 0); // очищаем файл
fwrite($fp, "Что-нибудь пишем сюда\n");
fflush($fp); // очищаем вывод перед отменой блокировки
flock($fp, LOCK_UN); // отпираем файл
} else {
echo "Не удалось получить блокировку !";
}
fclose($fp);
Вот в этой теме описано, что локи могут работать не так, как ожидается: Вопрос по flock в php