Задать вопрос
@Us59

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

$lock = fopen(__DIR__ . '/lock_start.lock', 'w');
        if (!($lock && flock($lock, LOCK_EX))) {
            exit('already running');
        }

Все вы наверное видели данный код, но для меня он не работает, или возможно я несовсем понимаю как он должен работать, т.к. я просто гуглил и наткнулся на него.

У меня cron, запускает wget каждую минуту, но мне требуется чтобы если сессия уже запущена она не запускалась повторно.

public function __construct()
    {
/// тут я добавлял проверку
    }
    public function __destruct()
    {
/// а тут я удалял файл.
    }

Данный код работает, если запускать один и тот же файл в 1 секунду несколько раз, но если прошло 3-4 секунды и попытаться запустить php скрипт снова - он запускается.
  • Вопрос задан
  • 1075 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@Barmunk
в линуксе есть нативная утилита flock. Она не даст запустить повторный cron пока предыдущий еще работает. Второй процесс может ожидать завершения первого и только после этого запуститься, либо прерывать все повторные запуски, пока работает первый процесс.

/usr/bin/flock -w 600 /var/tmp/myscript.lock /root/myscript.sh


https://pingtool.org/ru/using-flock-to-ensure-only...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@grisha2217
Попробуйте через БД. В столбце is_running ставить 1, после окончания ставить 0.
При запуске проверять значение столбца
Ответ написан
donflash
@donflash
Используйте этот компонент
https://symfony.com/doc/current/components/lock.html
Ответ написан
Комментировать
solotony
@solotony
покоряю пик Балмера
возможно я несовсем понимаю как он должен работать


смысл данного кода прост как мычание

$lock = fopen(__DIR__ . '/lock_start.lock', 'w');

открываете файл

if (!($lock && flock($lock, LOCK_EX)))  exit('already running');


пытаетесь установить блокировку, если установить блокировку не удается то выходит

для корректной работы скрипта должна быть доступна операция записи в файл __DIR__ . '/lock_start.lock'
а если файла нет, то должна быть доступна операция создания файла в каталоге __DIR__

p.s. использовать базу данных можно только если она допускает транзакцию, что бы чтение и запись были атомарными.
p.p.s. в обоих случаях возможны дедлоки, следует предусмотреть как их обходить
Ответ написан
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
По идее этот код надо вставить в начало скрипта, сразу после <?php, а делее уже ваш код классы и тд.
Удалять файл не нужно, так как блокировка сама снимется когда скрипт закончит работу, и блокировка будет активна пока скрипт в работе.

<?php

$lock = fopen(__DIR__ . '/lock_start.lock', 'w');
        if (!($lock && flock($lock, LOCK_EX))) {
            exit('already running');
        }

//далее ваш код
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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