Почему Apache не может обрабатывать несколько запросов одновременно?
У меня установлен AMPPS.
Мой сервер Apache не может обрабатывать несколько запросов php одновременно (например, если я позвоню localhost/script.php
несколько раз, они обрабатываются в последовательном порядке). script.php
состоит только из <?php sleep(10); ?>
,
Я прочитал, что директива MaxClients отвечает за одновременную настройку доступа, но в моем httpd.conf
совсем.
Отключение Xdebug и запись session_write_close();
к началу сценария не сработало.
Когда я добавил session_start();
к началу файла и мой код выглядел так:
<?php
session_start();
session_write_close();
sleep(10);
phpinfo();
echo "Done";
Делая 5 запросов к localhost/script.php
, последние 4 ожидали окончания первого, а затем заканчивались одновременно.
Пожалуйста, помогите мне решить проблему. Если какая-либо информация, необходимая для решения этой проблемы, отсутствует, сообщите об этом, и я добавлю ее.
9 ответов
apcahe, безусловно, может обрабатывать несколько запросов одновременно, что-то не так в вашей конфигурации apache.
Это зависит от того, какую версию Apache вы используете и как она настроена, но общая конфигурация по умолчанию использует несколько рабочих с несколькими потоками для обработки одновременных запросов. См. http://httpd.apache.org/docs/2.2/mod/worker.html для краткого изложения того, как это работает.
Причина, по которой вы сталкиваетесь с этим: где-то есть какая-то блокировка, которая может случиться, например, если два запроса поступают от одного и того же клиента и вы используете файловые сеансы в PHP: во время выполнения скрипта, сеанс "заблокирован", что означает, что сервер / клиент должен будет дождаться завершения первого запроса (и разблокирования файла), чтобы иметь возможность использовать файл для открытия сеанса для второго пользователя.
Запросы поступают от одного и того же клиента и одного и того же браузера; в этом случае большинство браузеров ставят запросы в очередь, даже если на стороне сервера ничего такого не происходит.
Возможно из-за блокировки сеансов. Если вам не нужно редактировать переменные сеанса, закройте его.
Манипулируйте вашими сессиями пишите на старте script.php
// manipulate writes, and unlock session file!
session_start();
$_SESSION['admin'] = 1;
$_SESSION['user'] = 'Username';
session_write_close(); // unlock session file, to another script can access
// start your script without php session block
sleep(30);
echo $_SESSION['user'];
// another script can run without wait this script finish
Я столкнулся с подобной проблемой. Несколько запросов постоянно зависали при подключении к серверу.
Попытка изменить конфигурации MPM, без использования.
Наконец, этот, кажется, решил проблему для меня. (с /questions/15676817/udalennoe-sobyitie-no-vse-esche-strelyayuschee/15676823#15676823)
AcceptFilter http none
EnableSendfile Off
EnableMMAP off
Artisan однопоточный! просто не обслуживайте свой проект с помощью ремесленника. Вместо этого создайте маршрут к вашему laravel/public. Или вы можете использовать Laravel Octan, который действительно мощный.
Попробуйте включить sleep и phpinfo в сеанс, прежде чем вызывать сеанс close. Похоже, что сеансы (все пять рассматриваются как одинаковые и завершаются с завершением первого). Возможно, проверьте, совпадают ли идентификаторы сессии. Сохраняя сеанс открытым, вы можете видеть, что одновременно они обрабатываются.
Вы пытались совершать одновременные звонки с разных вкладок браузера / окон / экземпляров?
Apache является многопоточным, поэтому он определенно может обрабатывать ваши параллельные запросы. Кажется, у вас есть кое-что проверить:
Делайте запросы с соответствующим клиентом для тестирования (например, тест Apache) - посмотрите на https://httpd.apache.org/docs/2.4/programs/ab.html
Проверьте настройки на apache. Есть некоторые неправильные настройки, которые могут вызывать странное поведение, например, один запрос за раз. Посмотрите на параметры fork и worker в httpd.conf. Предложение: используйте все параметры по умолчанию для тестирования.
Apache предоставляет множество модулей мультиобработки (Apache называет эти MPM), которые определяют, как обрабатываются клиентские запросы. По сути, это позволяет администраторам легко менять архитектуру обработки соединений. Это:
- mpm_prefork: этот модуль обработки порождает процессы с одним потоком каждый для обработки запроса. Каждый ребенок может обрабатывать одно соединение одновременно.
- mpm_worker: этот модуль порождает процессы, каждый из которых может управлять несколькими потоками. Каждый из этих потоков может обрабатывать одно соединение. Поскольку потоков больше, чем процессов, это также означает, что новые соединения могут немедленно занять свободный поток вместо того, чтобы ждать свободного процесса.
- mpm_event: этот модуль похож на рабочий модуль в большинстве ситуаций, но оптимизирован для обработки поддерживающих соединений. При использовании рабочего MPM соединение будет удерживать поток независимо от того, активно ли выполняется запрос, пока соединение поддерживается.
Вы можете перенести сохранение сессии из файлов в базу данных - тогда у вас будет возможность запросить все файлы сразу, без ожидания - или - если вам не нужен сеанс в вашем скрипте, отключите его (не используйте session_start();
)