Несколько php запросов одновременно, второй запрос не начинается, пока не закончится первый - PullRequest
6 голосов
/ 27 февраля 2020

У меня есть длительный php 7.2 скрипт, который создает zip-файл. Я хочу использовать циклический вызов ajax, чтобы проверить ход создания zip-файла. Второй скрипт выглядит заблокированным и не начинает обработку до тех пор, пока первый скрипт не будет полностью выполнен.

Фактически, второй сценарий даже не печатает error_log () в строке 1 моего индекса. php сценарий маршрутизации до тех пор, пока первый сценарий не будет полностью завершен.

Вверху моего index.php скрипта роутера:

<?
error_log('top of index '.$_SERVER['REQUEST_URI']);

Это верно, даже если я просто запрашиваю stati c ресурсы изображения. Error_log () в строке 1 даже не печатается, пока полностью не завершится долгосрочный скрипт.

Сначала я полагал, что столкнулся с блокировкой сеанса, как описано здесь , но предлагаемое ими решение не работает (вызов session_write_close()), и мне интересно, что-то еще происходит, потому что второй сценарий блокируется перед строкой 1, а не блокируется, когда я пытаюсь начать сеанс. Второй скрипт, похоже, не запускается ВСЕ. Я подумал, что, возможно, сервер автоматически запускает сессию до строки 1, но я проверил, и у моего сервера session.auto_start = 0.

Есть ли какая-либо конфигурация сервера, которую мне нужно установить?

Чего мне не хватает? Что я делаю неправильно?

Я запускаю это на локальном хосте (Ma c) со встроенным PHP сервером.

php -c /usr/local/etc/php/7.2/php.ini -S 127.0.0.1:8080 index.php

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Встроенный сервер поддерживает несколько рабочих, начиная с PHP 7.4 и далее (на платформах, где доступен fork ()). Смотрите этот коммит: https://github.com/php/php-src/commit/82effb3fc7bcab0efcc343b3e03355f5f2f663c9

Чтобы использовать его, добавьте переменную среды PHP_CLI_SERVER_WORKERS перед запуском сервера. Например:

PHP_CLI_SERVER_WORKERS=10 php7.4 -S 127.0.0.1:7080 index.php

Я рекомендую обновить установку PHP 7.2, если вы хотите использовать эту функцию.

2 голосов
/ 27 февраля 2020

Встроенный веб-сервер является однопоточным, однопроцессным, синхронным сервером. Он предназначен только для тестирования. Он может обрабатывать только один запрос за раз. Он не может одновременно обслуживать несколько одновременных запросов.

...