Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Как указать браузеру, что это уже другой PHP скрипт?

Я хочу ограничить количество одновременных обработок запросов в PHP до одной или двух с одного IP адреса. Под обработкой подразумевается обработка, к примеру, прогой Imagick (ImageMagick для PHP), например, сильное размытие (blur) большой картинки, что занимает достаточно много времени и, следовательно, сильно грузит процессор и приводит его в полный стопор.
Написал простой php скрипт с записью IP пользователя в Mysql. И вот что он делает:
Получение IP пользователя Проверка, есть ли он в базе Если есть больше двух таких же IP, то показать посетителю сообщение, что запускать две обработки одновременно нельзя. Остановить дальнейшее выполнение php-скрипта. Если такого IP нет - записать его в БД Обработать картинку, и пусть обработка будет длится 25 секунд, т.е. заменил функцией sleep() (задержка в секундах) После обработки (не важно успешной или нет) удалить IP из БД Всё, отключиться от Mysql.
Объясняю суть проблемы: если создать в браузере 3 вкладки (оганичение-то не более двух одновременно в PHP) с адресом текущего скрипта, просто вставив его из буфера обмена и вручную запустить их поочерёдно (то есть просто запустить копии этого php-скрипта), то каждый скрипт почему-то ждёт предыдущего, пока он не завершится, а в БД после их запуска добавляется только одна запись и лишь через 25 секунд добавляются остальные! Выходит, что можно запустить хоть 20 обработок и они не будут ограничены!
Если в базу заранее добавить 10 таких одинаковых ip, то скрипт моментально показывает, что нельзя производить две одновременных обработки, то есть работает как надо, если в БД уже есть два или больше двух одинаковых IP.
Если этот скрипт запускать в разных браузерах, то тоже работает нормально - две одинаковых записи в базу данных добавляются практически моментально после запуска. А вот в одном браузере не получается - каждый последний запущенный скрипт как-бы ждёт завершения предыдущего и записи IP в БД добавляются только через 25 секунд.
Если назвать копии этого скрипта по-разному, например: script1.php, script2.php и script3.php а затем запустить их также сразу вручную и в одном и том же браузере, то тоже работает правильно - записи в БД добавляются как раз после того, как я их запустил, а не через 25 сек и без ожидания завершения предыдущего (выходит + 1-3 секунды, в зависимости как быстро их вручную запускать по очереди).
У меня только есть подозрение, что где-то надо сбрасывать какую-то сессию или что-то в этом роде, так как несколько запущенных копий скрипта в одном браузере не ограничиваются, а если запустить в разных браузерах - всё работает правильно!
Что может мешать добавлять сразу два ip в БД после одновременного запуска двух копий одного и того же скрипта в браузере? (вместо этого IP из 1-го скрипта добавляется как надо сразу, а 2-й IP из второго скрипта только тогда, когда завершается 1-й скрипт)


Ответ

Все правильно, дело в сессии.
PHP не начнет обрабатывать новый запрос, если не завершена работа с сессией предыдщуего, т.к. файл сессии заблокирован первым запросом. Это сделано для того, чтобы два обработчика не писали одновременно в один и тот же файл.
Чтобы следующий запрос стал обрататываться при еще не завершившейся обработке предыдущего, требуется в первом запросе закрыть файл сессии с помощью функции session_write_close(). В Вашем случае это надо сделать перед запуском обработки изображения. Разумеется, после вызова этой функции Вы уже не сможете ничего записать в сессию в текущем обработчике.

Комментариев нет:

Отправить комментарий