Одночасні запити до PHP Script


85

Якщо PHP Engine вже посередині виконує скрипт на сервері, що станеться з іншими одночасними запитами браузера до того самого сценарію?

  • Чи будуть запити в черзі?
  • Чи будуть вони проігноровані?
  • Чи буде кожен запит мати свій власний екземпляр сценарію?
  • Будь-яка інша можливість?

1
Також перевірте цю відповідь: konrness.com/php5/how-to-prevent-blocking-php-requests
trante

Відповіді:


140

Сервер, залежно від його конфігурації, може одночасно обслуговувати сотні запитів одночасно - якщо використовується Apache, параметр MaxClientsконфігурації говорить:

MaxClientsДиректива встановлює обмеження на кількість одночасних запитів , які будуть обслуговуватися.
Будь-які спроби підключення, що перевищують MaxClients обмеження, зазвичай ставляться в чергу, до числа, виходячи з директиви ListenBacklog.
Як тільки дочірній процес буде звільнений в кінці іншого запиту, з'єднання буде обслуговуватися.


Той факт, що два клієнти запитують одну сторінку, не є проблемою.

Тому :

Чи будуть запити в черзі?

Немає ; крім випадків, коли:

  • десь є якийсь замок - це може статися, наприклад, якщо два запити надходять від одного клієнта, і ви використовуєте файлові сеанси в PHP : під час виконання скрипту сеанс "блокується", що означає, що серверу / клієнту доведеться почекати, поки перший запит не буде завершено (і файл розблоковано ), щоб мати можливість використовувати файл для відкриття сеансу для другого користувача.
  • запити надходять від одного клієнта І того самого браузера; більшість браузерів поставлять запити в чергу в цьому випадку, навіть коли на сервері немає нічого, що створює таку поведінку.
  • є більше, ніж MaxClientsзараз активних процесів - див. цитату з посібника Apache безпосередньо перед цим.


Чи будуть вони проігноровані?

Ні: це означало б, що лише один користувач може одночасно користуватися веб-сайтом; це було б не зовсім приємно, правда?

Якби це було так, я б не міг опублікувати цю відповідь, якщо ви, коли натискаєте клавішу F5 у той самий момент, бачите, чи хтось відповів!
(Ну, SO не в PHP, але принципи однакові)


Будь-яка інша можливість?

Так ^^


редагувати після редагування OP та коментаря:

Чи буде кожен запит мати свій власний екземпляр сценарію?

Не існує такого поняття, як " екземпляр сценарію ": простіше кажучи, те, що відбувається там, де робиться запит на сценарій:

  • веб-сервер розгалужує інший процес для обробки запиту (часто, з міркувань продуктивності, ці розгалуження робляться заздалегідь, але це нічого не змінює)
  • процес читає PHP-скрипт з диска
    • кілька процесів можуть робити це одночасно : блокування читання файлів не відбувається
    • файл завантажується в пам’ять; в окремому блоці пам'яті для кожного процесу
  • файл PHP в пам'яті " компілюється " до кодів операцій - все ще в пам'яті
  • ці коди операцій виконуються - все ще з блоку пам'яті, який належить процесу, що відповідає на ваш запит


Дійсно, ви можете мати двох користувачів, які надсилають запит на один і той же PHP-скрипт (або на різні PHP-скрипти, які всі містять один і той же PHP-файл) ; це однозначно не проблема, інакше жоден веб-сайт, над яким я коли-небудь працював, не буде працювати!


Якщо декілька одночасних запитів отримують доступ до одного і того ж php-файлу, яким буде результат. чи інші запити залишатимуться в очікуванні, або кожен запит матиме власний екземпляр сценарію?
Kevin Boyd

3
Не існує такого поняття, як "екземпляр сценарію": кожен запит обробляється окремим процесом (або потоком) ;; сценарії зчитуються з пам'яті / диска, але один і той же файл можна читати з багатьох процесів одночасно без проблем (принаймні, в "сучасних" операційних системах - тобто як Windows, так і Linux)
Pascal MARTIN

Це відмінна відповідь, де я міг би дізнатися більше подробиць про те, як працює PHP? Будь-яка хороша книга для цього?
Kevin Boyd

1
Я насправді не знаю про це: я здогадуюсь переглядати посібник, читати статті в Мережі, запитання / відповіді тут і там, і робота з PHP протягом декількох років - це гарний спосіб навчитися - але я можу t дійсно рекомендую будь-яку книгу, яка б пояснила, як саме працює PHP ;; є деяка інформація в "Розширення та вбудовування PHP", але її темою є не пояснення того, як працює PHP ;; може php.net/manual/en/internals2.php може допомогти?
Паскаль МАРТІН,

Досконалість! Мені дуже допомогло!
zookastos

21

Якщо 2 клієнти телефонують на сервер одночасно, сервер, швидше за все, може відповісти обом клієнтам майже одночасно. Клієнтів тут я визначаю їх на рівні браузера.

Це означає сказати, що на одній машині, якщо ви використовуєте 2 браузери для завантаження одного веб-сайту / сторінки одночасно, обидва повинні завантажуватися одночасно.

однак, оскільки ми говоримо про PHP, вам потрібно робити спеціальні нотатки щодо сесій. Якщо ваші сторінки використовують сеанси, сервер обслуговує лише одну сторінку за раз. Це тому, що файл сеансу буде заблоковано, доки сценарій не вийде.

Подивіться на цей приклад. Два файли завантажуються з одного сеансу, тобто одного і того ж браузера.

      scripta.php requested                 scripta.php served
------+---+---------------------------------+------------------------>
          scripta.php started

               scriptb.php requested           scriptb.php started
---------------+-------------------------------+-----------------+--->
                                                                 scriptb.php served.

Зверніть увагу, що scriptb.php запускається лише після подання scripta.php. це тому, що при запуску сценарію.php файл сеансу блокується для інших сценаріїв, щоб скрипт.php міг писати у файл сеансу. Коли скрипт.php завершується, файл сеансу розблоковується, і, отже, інші сценарії можуть використовувати його. Таким чином scriptb.php зачекає, поки файл сеансу звільниться, тоді він заблокує файл сесії та використає його.

Цей процес буде постійно повторюватися, щоб запобігти затримці написання декількох сценаріїв до одного і того ж файлу сеансу. Тому рекомендується викликати session_write_close(), коли ви більше не використовуєте сеанс, особливо на веб-сайті, що використовує багато фреймів або AJAX.


4

Просто натрапив на це сам. В основному вам потрібно зателефонувати, session_write_close()щоб запобігти блокуванню одного користувача. Переконайтеся, що після дзвінка session_write_close()ви не намагаєтесь змінювати будь-які змінні сеансу. Після того, як ви це покличете, відтепер розглядайте сесії як лише для читання.


3

Якщо ви не використовуєте дуже нестандартну установку, ваш веб-сервер (Apache, IIS, nginx тощо) матиме кілька процесів, які запускають PHP окремо для кожного запиту, що надходить на сервер. Одночасні запити будуть обслуговуватися одночасно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.