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