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