Почему Apache не может обрабатывать несколько запросов одновременно?


У меня установлены усилители.

Мой сервер 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 ждали завершения первого, а затем завершились одновременно.

Пожалуйста, помогите мне решить эту проблему. Если какая-либо информация, необходимая для решения этой проблемы, отсутствует, пожалуйста, сообщите об этом, и я добавлю ее.

Author: nicks, 2016-05-25

8 answers

Apcahe, безусловно, может обрабатывать несколько запросов одновременно, в вашей конфигурации apache наверняка что-то не так.

Это зависит от того, какую версию Apache вы используете и как она настроена, но обычная конфигурация по умолчанию использует несколько рабочих с несколькими потоками для обработки одновременных запросов. См. http://httpd.apache.org/docs/2.2/mod/worker.html для краткого описания того, как это работает.

Причина, по которой вы сталкиваетесь с этим, заключается в: Есть какая-то блокировка где-то - что может произойти, например, если два запроса поступают от одного и того же клиента, и вы используете сеансы на основе файлов в PHP: во время выполнения сценария сеанс "заблокирован", что означает, что серверу/клиенту придется подождать, пока первый запрос не будет завершен (и файл разблокирован), чтобы иметь возможность использовать файл для открытия сеанса для второго пользователя.

Запросы поступают от одного и того же клиента И одного и того же браузера; большинство браузеров будут помещать запросы в очередь в в этом случае, даже если на стороне сервера нет ничего, вызывающего такое поведение.

 14
Author: kshitij, 2016-06-08 13:59:01

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

Http://php.net/manual/en/function.session-write-close.php

 4
Author: Viktor Koncsek, 2016-05-25 08:20:00

Пытались ли вы совершать одновременные вызовы с разными вкладками/окнами/экземплярами браузера?

Apache многопоточен, поэтому он определенно может обрабатывать ваши параллельные запросы. Похоже, вам нужно кое-что проверить:

  • Делайте запросы с соответствующим клиентом для тестирования (например, тест apache) - Взгляните на https://httpd.apache.org/docs/2.4/programs/ab.html

  • Проверьте свои настройки на apache. Есть некоторые неправильные настройки, которые могут производить странное поведение, например, один запрос за раз. Взгляните на параметры fork и worker в httpd.conf. Предложение: используйте все параметры по умолчанию для тестирования.

 0
Author: Tiago Luz, 2016-06-08 05:24:10

Apache предоставляет множество многопроцессорных модулей (Apache называет их MPMS), которые определяют, как обрабатываются запросы клиентов. В принципе, это позволяет администраторам легко менять архитектуру обработки подключений. Это:

  1. mpm_prefork: Этот модуль обработки порождает процессы с одним потоком каждый для обработки запроса. Каждый ребенок может обрабатывать одно соединение одновременно.
  2. mpm_worker: Этот модуль порождает процессы, которые могут каждый управляйте несколькими потоками. Каждый из этих потоков может обрабатывать одно соединение.Поскольку потоков больше, чем процессов, это также означает, что новые соединения могут немедленно использовать свободный поток вместо того, чтобы ждать свободного процесса.
  3. mpm_event: Этот модуль в большинстве ситуаций аналогичен рабочему модулю , но оптимизирован для обработки подключений с сохранением активности. При использовании рабочего MPM соединение будет содержать поток независимо от того, активно ли выполняется запрос сделано до тех пор, пока связь сохраняется.
 0
Author: swaroop suthar, 2016-06-09 11:28:49

Попробуйте включить режим сна и phpinfo в сеанс перед вызовом закрытия сеанса. Как это выглядит, сеансы (все пять рассматриваются как одинаковые и завершаются с завершением первого). Возможно, проверьте, совпадают ли идентификаторы сеансов. Сохраняя сеанс открытым, вы можете видеть, что они обрабатываются одновременно.

 0
Author: Kumar, 2016-06-09 22:13:01

Манипулируйте своими сеансами, записывайте в начале 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
 0
Author: Leonardo Filipe, 2018-04-14 13:41:19

Я столкнулся с аналогичной проблемой. Несколько запросов продолжали случайным образом зависать при подключении к серверу.

Попытался изменить конфигурации mpm, но безрезультатно.

Наконец-то это, кажется, решает проблему для меня. (из https://serverfault.com/a/680075)

AcceptFilter http none
EnableSendfile Off 
EnableMMAP off 
 0
Author: Thiagesh thg, 2018-07-15 17:39:33

Вы можете переместить хранение сеансов из файлов в базу данных - тогда у вас будет возможность запрашивать ваши файлы сразу, не дожидаясь - или - если вам не нужен сеанс в вашем скрипте, отключите его (не используйте session_start();)

 -1
Author: r_a_f, 2016-05-25 08:37:21