lockProcess
/**
* Функция ограничения кол-ва одновременно запущенных процессов скрипта с помощью файловых локов.
* Полезна для скриптов, которые запускаются по крону с некоторой периодичностью.
*
* @param string $file путь к файлу __FILE__
* @param integer $processes Разрешенное кол-во одновременно запущенных процессов скрипта
*/
function lockProcess($file, $processes = 1) {
$lock_file = $file . '_0.lock';
$lock_exists = file_exists($lock_file);
$i = 0;
while ($i < $processes) {
$lock_file = $file . '_' . $i . '.lock';
$lock_exists = file_exists($lock_file);
if (!$lock_exists) {
break;
}
$i++;
}
// Если блокировку получить не удалось, значит второй экземпляр скрипта работает
$lock_file_handler = fopen($lock_file, 'w');
if (!flock($lock_file_handler, LOCK_EX | LOCK_NB)) {
exit('Process already running!');
}
// Если файл блокировки уже существовал, но не был залочен, значит предыдущий запуск скрипта завершился некорректно
if ($lock_exists) {
error_log('Предыдущий запуск завершился с ошибкой!');
}
// По окончании работы необходимо снять блокировку и удалить файл
register_shutdown_function(function() use ($lock_file_handler, $lock_file) {
flock($lock_file_handler, LOCK_UN);
unlink($lock_file);
});
}