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 будет работать одинаково независимо от браузера, запрашивающего страницу.