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

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

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

4 ответа

Решение

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

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


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

Так:

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

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

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


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

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

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


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

Да ^^


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

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

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

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


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

Если 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.

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

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

Другие вопросы по тегам