Как запретить одновременный запуск 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 секунд.
  • Вопрос задан
  • 355 просмотров
Решения вопроса 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
с вашим подходом можно решить только задачу, чтобы они работали последовательно.
если задача, чтобы второй скрипт досрочно завершил работу, то нужен
семафор (скрипт работает).
Можно проверять существование определенного файла и если он есть, то выход.
Но не забываем, что из-за ошибки файл семафора может не удалиться по завершению скрипта.
Как вариант имя зависит от даты и текущего часа. В этом случае при сбое, на следующий час исполнение автоматически продолжиться.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы