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

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

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

Ответ 1

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

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


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

Итак:

Будут ли очереди в очереди?

Нет; кроме если:

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


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

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

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


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

Да ^^


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

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

Нет такой вещи, как "script instance": просто укажите, что происходит, когда делается запрос к script:

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


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

Ответ 2

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

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

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

Посмотрите на этот пример. 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.

Ответ 3

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

Ответ 4

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