Почему Apache не может обрабатывать несколько запросов одновременно?
у меня установлен AMPPS.
мой сервер Apache не может обрабатывать несколько запросов php одновременно (например, если я вызываю localhost/script.php
несколько раз, они обрабатываются последовательно). script.php
состоит только из <?php sleep(10); ?>
.
Я читал, что MaxClients директива отвечает за конфигурацию параллельного доступа, но она отсутствует в my httpd.conf
на всех.
отключение Xdebug и запись session_write_close();
к началу сценария не сделал работа.
когда я добавил session_start();
в начале файла и мой код выглядел так:
<?php
session_start();
session_write_close();
sleep(10);
phpinfo();
echo "Done";
при выполнении 5 запросов к localhost/script.php
, последние 4 ждали окончания первого, а затем закончились одновременно.
пожалуйста, помогите мне решить эту проблему. Если какая-либо информация, необходимая для решения этой проблемы, отсутствует, сообщите об этом, и я добавлю ее.
8 ответов
apcahe, безусловно, может обрабатывать несколько запросов одновременно, что-то, безусловно, происходит неправильно в вашей конфигурации apache.
Это зависит от того, какую версию Apache вы используете и как она настроена, но общая конфигурация по умолчанию использует несколько рабочих с несколькими потоками для обработки одновременных запросов. Вижу http://httpd.apache.org/docs/2.2/mod/worker.html рассказала о том, как это работает.
причина, по которой вы столкнулись это есть: Где - то есть блокировка, которая может произойти, например, если два запроса поступают от одного клиента, и вы используете сеансы на основе файлов в PHP : во время выполнения скрипта сеанс "заблокирован", что означает, что сервер/клиент должен будет подождать, пока первый запрос не будет завершен (и файл разблокирован), чтобы иметь возможность использовать файл для открытия сеанса для второго пользователя.
запросы поступают от того же клиента и того же браузера; большинство браузеров будут стоять в очереди запросы в этом случае, даже если на стороне сервера нет ничего, вызывающего такое поведение.
вероятно, из-за блокировки сеансов. Если вам не нужно редактировать переменные сеанса, закройте его.
вы пытались сделать одновременные вызовы с различными вкладками браузера / окнами / экземплярами ?
Apache многопоточен, поэтому он определенно может обрабатывать ваши параллельные запросы. Похоже, у вас есть некоторые вещи, чтобы проверить:
сделайте запросы с соответствующим клиентом для тестирования ( например, Apache benchmark) - взгляните на https://httpd.apache.org/docs/2.4/programs/ab.html
проверьте настройки на apache. Есть некоторые неправильные настройки, которые могут вызвать странное поведение, например, один запрос за раз. Взгляните на параметры fork и worker в httpd.conf. Предложение: используйте все параметры по умолчанию для тестирования.
Apache предоставляет множество многопроцессорных модулей (Apache называет эти MPMs), которые диктуют, как обрабатываются клиентские запросы. В принципе, это позволяет администраторам легко менять архитектуру обработки соединений. Это:
- mpm_prefork: этот модуль обработки порождает процессы с одним потоком каждый для обработки запроса. Каждый ребенок может справиться с одним подключение одновременно.
- mpm_worker: этот модуль порождает процессы, каждый из которых может управлять несколькими потоками. Каждый из этих потоков может обрабатывать один соединение.Поскольку существует больше потоков, чем процессов, это также означает, что новые соединения могут сразу взять свободный поток вместо того, чтобы ждать свободного процесса.
- mpm_event: этот модуль похож на рабочий модуль в большинстве ситуации, но оптимизирован для обработки keep-alive соединений. Когда используя рабочий MPM, соединение будет содержать поток независимо от активно ли делается запрос до тех пор, пока связь сохраняется.
попробуйте включить сон и phpinfo в сеансе перед вызовом сеанса закрыть. Как это выглядит сеансы (все пять рассматриваются как одно и то же и завершаются с первым завершается). Возможно, проверьте, совпадают ли идентификаторы сеанса. Сохраняя сеанс открытым, вы можете видеть, что одновременно они обрабатываются.
манипулировать вашими сеансами писать на старте скрипта.в 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, без использования.
наконец, это, кажется, решает проблему для меня. (от https://serverfault.com/a/680075)
AcceptFilter http none
EnableSendfile Off
EnableMMAP off
вы можете переместить сеанс хранения из файлов в базу данных-чем у вас будет возможность запросить ваши файлы сразу, не дожидаясь-или - если вам не нужен сеанс в вашем скрипте, выключите его (не используйте session_start();
)