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

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

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

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

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

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

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

Так :

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

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

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

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

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

Если бы это было так, я бы не смог опубликовать этот ответ, если вы, когда нажимаете F5 в тот же момент, чтобы узнать, ответил ли кто-нибудь!
(Ну, SO не в 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 запускается только после того, как scripta.php подан. это происходит потому, что, когда scripta.php запущен, файл сеанса заблокирован для других скриптов, так что scripta.php может записать файл сеанса. Когда scripta.php завершается, файл сеанса разблокируется, и, таким образом, другие скрипты могут его использовать. Таким образом scriptb.php будет ждать, пока файл сеанса будет освобожден, тогда он заблокирует файл сеанса и будет использовать его.

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

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

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