Loremipsumdolorsit
9/12/2017 - 8:34 AM

lockProcess

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