Одновременные запросы к php скрипту

Если движок PHP уже находится в середине выполнения скрипта на сервере, что произойдет с другими одновременными запросами браузера к тому же скрипту?

  • будут запросы в очередь?
  • они будут проигнорированы?
  • каждый запрос будет иметь свой собственный сценарий экземпляра?
  • любая другая возможность?

4 ответов


сервер, в зависимости от своей конфигурации, может вообще служить сотни запросов в то же время -- при использовании Apache MaxClients опция конфигурации-это то, что говорит:

на MaxClients директива устанавливает ограничение на количество одновременных запросы, которые будут обслуживаться.
любой попытки подключения через MaxClients ограничение обычно будет в очереди, до номера, основанного на ListenBacklog директива.
после того, как ребенок процесс освобождается в конце другой запрос, соединение будет тогда обслуживайтесь.


Тот факт, что два клиента запрашивают одну и ту же страницу-не проблема.

так :

будут ли запросы поставлены в очередь?

нет, за исключением, если :

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


они будут проигнорированы?

нет: это означало бы, что только один пользователь может одновременно использовать веб-сайт ; это было бы не очень приятно, не так ли ?

если бы это было так, я не мог бы опубликовать этот ответ, если бы вы нажали F5 одновременно момент, чтобы увидеть, если кто-то ответил !
(Ну, так не в PHP, но принципы те же)


любая другая возможность?

да ^^


редактировать после редактирования OP и комментария:

каждый запрос будет иметь свой собственный сценарий экземпляра?

нет такой вещи, как"экземпляр скрипта" : проще говоря, то, что происходит, когда делается запрос на скрипт:

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


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


Если 2 клиента одновременно вызывают сервер, сервер, скорее всего, сможет ответить обоим клиентам почти одновременно. Клиенты здесь я определяю их до уровня браузера.

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

однако, поскольку мы говорим о PHP, вам нужно сделать специальные заметки о сеансах. Если ваши страницы используют сеансы, сервер обслуживает только одну страницу за раз. Это связано с тем, что файл сеанса будет заблокирован до выхода скрипта.

посмотрите на этот пример. Файлы 2 загружаются из того же сеанса, что и тот же браузер, тот же пользователь.

      scripta.php requested                 scripta.php served
------+---+---------------------------------+------------------------>
          scripta.php started

               scriptb.php requested           scriptb.php started
---------------+-------------------------------+-----------------+--->
                                                                 scriptb.php served.

обратите внимание, что scriptb.php запускается только после скрипты.PHP-это утро. это потому, что когда скрипта.php запущен, файл сеанса заблокирован для других скриптов, так что скрипта.php может записывать в файл сеанса. Когда скрипта.php завершается, файл сеанса разблокирован и таким образом другие скрипты могут использовать его. Таким образом scriptb.php будет ждать, пока файл сеанса не будет освобожден, затем он заблокирует файл сеанса и использует его.

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


Если вы не используете очень нестандартную настройку вашего веб-сервера (Apache, IIS, nginx и т. д.) будет иметь несколько процессов, которые запускают PHP отдельно для каждого запроса, который входит в сервер. Одновременные запросы будут обслуживаться одновременно.


просто столкнулся с этим сам. В основном вам нужно позвонить session_write_close() для предотвращения блокировки одного пользователя. Убедитесь, что после вызова session_write_close() вы не пытаетесь изменить какие-либо переменные сеанса. Как только вы назовете это, рассматривайте сеансы только для чтения с этого момента.