Одновременные запросы к PHP Script - PullRequest
83 голосов
/ 16 сентября 2009

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

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

Ответы [ 4 ]

138 голосов
/ 16 сентября 2009

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

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


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

Итак:

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

Нет; кроме случаев, если:

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


Будут ли они игнорироваться?

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

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


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

Да ^^


редактировать после того, как вы отредактировали ОП и комментарий:

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

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

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


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

19 голосов
/ 16 сентября 2009

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

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

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

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

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

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

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

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

4 голосов
/ 11 июня 2016

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

3 голосов
/ 16 сентября 2009

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

...