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

Есть файл test.php
В этом файле я добавил вот такой код:
public function __construct()
{
       $lock = fopen('lock_file.lock', 'w');
        if (!($lock && flock($lock, LOCK_EX | LOCK_NB))) {
            exit('already running');
        }
}


Теперь делаем простую вещь: переходим по адресу 111.222.333/test.php тем самым запускаем скрипт, далее он начинает выполняться, тем временем мы открываем новую вкладку и делаем еще один запуск - он УСПЕШНО выполняется без ошибок.
обе вкладки грузятся секунд 30-40 и по завершению загрузки не выдают ошибок, т.е. в обоих случаях скрипт выполнился.

ВОПРОС: Как в итоге запретить повторный запуск скрипта??? Т.е. если скрипт уже выполняет задачу, чтобы даже если мы пытаемся запустить его еще раз он сразу завершал попытку и не грузился 30 секунд.
  • Вопрос задан
  • 520 просмотров
Решения вопроса 4
@dimuska139
Backend developer
Если у тебя в PHP скриптах используются сессии, то с одного браузера ты параллельно скрипты не запустишь, даже из разных вкладок браузера. Скрипты выполняются последовательно. Попробуй через инкогнито или один скрипт дернуть одним браузером, другой - другим.
Ответ написан
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Лучше всего, вместо костылей из файлов, использовать готовый инструмент: https://www.php.net/manual/ru/class.syncmutex.php
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
public function __construct()
{
  if (file_exists('lock_file.lock')) {
    exit('already running');
  }
  touch('lock_file.lock');
}

public function __destruct()
{
  unlink('lock_file.lock');
}
Ответ написан
sergiks
@sergiks Куратор тега PHP
♬♬
Попробуйте как-то так:
const FLAGFILE = 'lock_file.lock';
private $myrun = true;

public function __construct()
{
    if (file_exists(self::FLAGFILE) {
        $this->myrun = false;
        exit('Lock file exists');
    }
    touch(self::FLAGFILE);
}

function __destruct ()
{
    if ($this->myrun) unlink(self::FLAGFILE);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@oxidmod
Это костыли все, между file_exists и file_put_contents проходит какое-то время. Два скрипта в паралель легко могу проверить что файла нет и попытаться его создать. Юзайте семафоры.
Ответ написан
@402d
начинал с бейсика на УКНЦ в 1988
с вашим подходом можно решить только задачу, чтобы они работали последовательно.
если задача, чтобы второй скрипт досрочно завершил работу, то нужен
семафор (скрипт работает).
Можно проверять существование определенного файла и если он есть, то выход.
Но не забываем, что из-за ошибки файл семафора может не удалиться по завершению скрипта.
Как вариант имя зависит от даты и текущего часа. В этом случае при сбое, на следующий час исполнение автоматически продолжиться.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
RecruitIT Москва
от 100 000 до 160 000 ₽
от 130 000 до 180 000 ₽
Сбер Москва
До 240 000 ₽
24 окт. 2020, в 22:43
3000 руб./за проект
24 окт. 2020, в 22:27
2500 руб./за проект