Для получения полного доступа
зарегистрируйтесь

Ограничение количества одновременно запущенных процессов php-скрипта


<?php
/**
 * Функция ограничения кол-ва одновременно запущенных процессов скрипта с помощью файловых локов.
 * Полезна для скриптов, которые запускаются по крону с некоторой периодичностью.
 *
 * @param string  $process_name Название скрипта
 * @param integer $processes    Разрешенное кол-во одновременно запущенных процессов скрипта
 */
function lockProcess($process_name, $processes = 1) {
    $lock_file   = __DIR__ . $process_name . '_0.lock';
    $lock_exists = file_exists($lock_file);
    $i = 0;
    while ($i < $processes) {
        $lock_file   = __DIR__ . $process_name . '_' . $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();
    }
    
    // Если файл блокировки уже существовал, но не был залочен, значит предыдущий запуск скрипта завершился некорректно
    if ($lock_exists) {
        error_log('Предыдущий запуск завершился с ошибкой!');
    }
    
    // По окончании работы необходимо снять блокировку и удалить файл
    register_shutdown_function(function() use ($lock_file_handler, $lock_file) {
        flock($lock_file_handler, LOCK_UN);
        unlink($lock_file);
    });
}

Чтобы увидеть комментарии, нужно быть участником сообщества

Регистрация