@Multigame

Как запретить повторный запуск скрипта?

Добрый день.
Необходимо запретить скрипту запускаться больше чем в 1ой копии. Подскажите, что не так?)
Раньше на freebsd и php 5.3 использовал следующий код
if(file_exists('/tmp/.locker')){
    $f = fopen('/tmp/.locker', "w+");
    if(!flock($f, LOCK_EX|LOCK_NB))$isLocked = true;

}else{
    $f = fopen('/tmp/.locker', "w+");
    if(!flock($f, LOCK_EX|LOCK_NB)) $isLocked = true;
}

Соответственно, если isLocked === true то завершаем скрипт.

Сейчас пытаюсь запустить то же на php 5.6 и centos. Блокировка не срабатывает. Первый запуск создает файл, но доступ к нему получают все экземпляры. В чем я не прав?
  • Вопрос задан
  • 4125 просмотров
Решения вопроса 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Я кстати не понял зачем нужен первый иф, если код в обоих ветках совпадает :)
Вообще flock не самое правильное решение, советую ознакомиться с вариантами
www.slideshare.net/fuenteovehuna/web-20-c?related=1
слайды 34-35

PS Вообще на 5.6 никаких изменений в этой функции вроде бы нет, php.net/manual/ru/function.flock.php попробуйте посмотреть на параметр wouldblock
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
saboteur_kiev
@saboteur_kiev
software engineer
Зачем вам вообще открывать этот файл?
Используйте locker как флаг, что если файл вообще есть - значит экземпляр скрипта запущен.

Логика такая:
1. Проверить есть ли файл.
1.1 Прочитать его (получить PID), проверить есть ли процесс с этим PID.
1.2 Если есть - значит один экземпляр скрипта запущен, и мы завершаемся.
2. Если нет - создаем файл,
2.1 пишем в него PID Текущего процесса
1.2 выполняем скрипт.
3. Удаляем файл.

А эти flock - вообще лишняя хрень.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы