Вопрос

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

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

Решение

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

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


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

Итак :

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

НЕТ ;за исключением того , что если :

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


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

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

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


Есть еще какая-нибудь возможность?

Да ^^


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

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

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

  • веб-сервер разветвляется другой процесс для обработки запроса (часто по соображениям производительности эти форки делаются заранее, но это ничего не меняет)
  • процесс считывает 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() когда вы больше не используете сеанс, особенно на веб-сайте, использующем множество iframes или AJAX.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top