Одновременные запросы к php скрипту
Если PHP-движок уже находится в середине выполнения скрипта на сервере, что произойдет с другими одновременными запросами браузера к тому же скрипту?
- будут ли запросы поставлены в очередь?
- они будут проигнорированы?
- каждый запрос будет иметь свой собственный сценарий
например? - любая другая возможность?
4 ответов:
сервер, в зависимости от его конфигурации, может вообще служить сотни запросов одновременно -- если используется Apache, то
MaxClientsпараметр конфигурации-это тот, который говорит:The
MaxClientsдиректива устанавливает ограничение на количество одновременных запросы, которые будут поданы.
любой попытки подключения черезMaxClientsограничение обычно будет поставленный в очередь, до номера основанного на ListenBacklog директива.
после того, как ребенок процесс освобождается в конце Различный запрос, соединение будет затем будут обслуживаться.
Тот факт, что два клиента запрашивают одну и ту же страницу-не проблема.так :
будут ли запросы поставлены в очередь?
нет, за исключением, если :
- есть немного замок где-то, что может произойти, например, если два запроса пришел от того же клиента, и вы используете файловые сессии в PHP: во время выполнения скрипта сеанс "заблокирован", что означает, что сервер/клиент должен будет дождаться завершения первого запроса (а файл разблокирован), чтобы иметь возможность использовать файл для открытия сеанса для второго пользователя.
- запросы поступают от одного и того же клиента и одного и того же браузера; большинство браузеров будут ставить запросы в очередь в этом случае, даже если нет ничего серверная сторона производит такое поведение.
- больше, чем
MaxClientsв настоящее время активные процессы -- см. цитату из руководства Apache только что.
они будут проигнорированы?
нет : это означало бы, что только один пользователь может использовать веб-сайт одновременно ; это было бы не совсем приятно, не так ли ?
если бы это было так, я не мог опубликовать этот ответ, если вы где-то нажмете F5 одновременно момент, чтобы увидеть, если кто-то ответил !
(Ну так не в PHP, но принципы те же)
любая другая возможность?
да ^^
редактировать после редактирования OP и комментарий:каждый запрос будет иметь свой собственный сценарий например?
нет такого понятия как "экземпляр скрипта" : проще говоря, то, что происходит, когда делается запрос на скрипт:
- веб-сервер-Форкс другой процесс для обработки запроса (часто, по соображениям производительности, эти вилки делаются заранее, но это ничего не меняет)
- процесс считывает PHP-скрипт с диска
- несколько процессов могут сделать это одновременно: нет блокировки на чтение файла
- файл загружается в память ; в отдельный блок памяти для каждого процесса
- PHP файл в памяти"compiled " к кодам операций -- все еще в памяти
- эти коды операций выполняются -- все еще из блока памяти, который принадлежит процессу, отвечающему на ваш запрос
Действительно, Вы можете иметь двух пользователей, отправляющих запрос на один и тот же 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 запускается только после скрипта.php обслуживается. это потому, что когда скрипта.php запущен, файл сеанса заблокирован для других скриптов, так что scripta.php может записывать в файл сеанса. Когда скрипта.php завершается, файл сеанса разблокирован и таким образом другие скрипты могут использовать его. Таким образом, scriptb.php будет ждать, пока файл сеанса не будет освобожден, затем он заблокирует файл сеанса и использует его.
этот процесс будет повторяться, чтобы предотвратить запись нескольких сценариев в один и тот же файл сеанса, вызывающий задержки. При этом рекомендуется звонить
session_write_close() когда вы больше не используете сеанс, особенно на веб-сайте, использующем много iframes или AJAX.
Если вы не используете очень нестандартную настройку вашего веб-сервера (Apache, IIS, nginx и т. д.) будет иметь несколько процессов, которые запускают PHP отдельно для каждого запроса, который поступает на сервер. Одновременные запросы будут обслуживаться одновременно.
просто столкнулся с этим сам. В основном вам нужно позвонить
session_write_close()для предотвращения блокировки одного пользователя. Убедитесь, что как только вы позвонитеsession_write_close()вы не пытаетесь изменить какие-либо переменные сеанса, хотя. Как только вы его вызовете, с этого момента рассматривайте сеансы как доступные только для чтения.
Comments