PHP flock() неблокирует все еще блокировать почему?

Я использую функцию flock(), чтобы проверить, запущен ли другой экземпляр скрипта, получив блокировку для временного файла, поэтому следующий экземпляр должен проверить, не заблокирован ли файл, иначе он остановится

<?php    
$fp = fopen("/var/tmp/your.lock", "w");
if (!flock($fp, LOCK_EX|LOCK_NB)) { // try to get exclusive lock, non-blocking
    die("Another instance is running");
} 

//my script 
sleep(10);
echo 'completed successfully';

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

Я знаю, что могут быть другие способы проверить, работает ли файл, экземпляр которого уже работает, но большинство из них сделает что-то, а затем отменит его, и в моем случае сценарий может завершиться в любое время, так как это может занять много времени или превысить лимит памяти или по любой причине

любая помощь?

2 ответа

Решение

Проблема была:

Двойной вызов одного и того же сценария с одним и тем же URL-адресом из браузера приведет к поточной обработке одного и того же процесса, и неблокирующая функция flock(), работающая на уровне процесса, заставит второй сценарий ждать

Например, двойной вызов example.com/test.php приведет к тому, что два запроса будут работать с одним и тем же процессом, а добавление любой случайной переменной создаст отдельный процесс для каждого отдельного запроса, например

example.com/test.php?rand=1
example.com/test.php?rand=2

работает отлично.

Запустите один и тот же скрипт из командной строки дважды. Я был бы готов поспорить, что это работает просто отлично.

Скорее всего, ваш браузер ограничивает скорость подключений к серверу, разрешая только одно подключение за раз к любому данному хосту. Тот факт, что вы получаете разные результаты в разных браузерах, указывает на то, что это не проблема PHP, поскольку PHP будет работать одинаково независимо от браузера, запрашивающего страницу.

Другие вопросы по тегам