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

85

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

  • Будут ли запросы стоять в очереди?
  • Будут ли они проигнорированы?
  • Будет ли каждый запрос иметь собственный экземпляр скрипта?
  • Любая другая возможность?
Кевин Бойд
источник
1
Также проверьте этот ответ: konrness.com/php5/how-to-prevent-blocking-php-requests
trante

Ответы:

140

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

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


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

Так :

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

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

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


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

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

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


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

Да ^^


отредактируйте после того, как вы отредактировали OP и комментарий:

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

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

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


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

Паскаль МАРТИН
источник
Если несколько одновременных запросов обращаются к одному и тому же файлу php, каков будет результат. будут ли другие запросы оставаться в ожидании или каждый запрос будет иметь свой собственный экземпляр скрипта?
Кевин Бойд,
3
Не существует такой вещи, как «экземпляр сценария»: каждый запрос обрабатывается отдельным процессом (или потоком) ;; сценарии читаются из памяти / диска, но один и тот же файл может быть прочитан из многих процессов одновременно без проблем (по крайней мере, в «современных» операционных системах - то есть как Windows, так и Linux)
Паскаль МАРТИН,
Это отличный ответ, где я могу узнать больше о том, как работает PHP? Есть ли хорошая книга для этого?
Кевин Бойд,
1
Я действительно не знаю об этом: я предполагаю, что просмотр руководства, чтение статей в сети, вопросы / ответы здесь и там, и работа с PHP в течение нескольких лет - хороший способ учиться, но я могу ' Я действительно рекомендую любую книгу, которая объясняет, как именно работает PHP ;; есть некоторая информация в разделе «Расширение и встраивание PHP», но его тема не состоит в том, чтобы объяснить, как работает PHP ;; может быть, php.net/manual/en/internals2.php может помочь?
Паскаль МАРТИН
Совершенство! Мне очень помогли!
zookastos
21

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

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

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

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

      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

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

Джастин
источник
3

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

conceptDawg
источник