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