Одновременные запросы к PHP-скрипту
Вопрос
Если движок 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 отдельно для каждого запроса, поступающего на сервер.Одновременные запросы будут обслуживаться одновременно.