PHP long polling - как долго должен быть "long"? - PullRequest
3 голосов
/ 07 июля 2011

При использовании длинного опроса в PHP, например,

$start_time = time();
while ((time() - $start_time) < 30) {
if ($db->getNewStuff()->rows > 0) {
    $response = "new stuff!";
    break;
}
usleep(1000000);
}
echo $response;

Как вы оцениваете, как долго вы "опрашиваете"?В этом примере я выбрал 30 секунд, потому что ... ну, я даже не могу сказать, почему.Apache потерпит крах?Будет ли мое приложение зависать / зависать / снижать производительность?

Кроме того: Сколько времени должен длиться процесс usleep?

Ответы [ 6 ]

2 голосов
/ 07 июля 2011

Вы можете легко насытить доступный процесс / рабочую область apache. Например, если apache настроен, как показано ниже:

StartServers       2
MinSpareServers    4
MaxSpareServers    8
ServerLimit        11
MaxClients         11
MaxRequestsPerChild  4000

Вы можете просто подать 11 запросов, и ваш сайт будет недоступен в течение последних 30 секунд. Если вы ищете просто подтверждение концепции, можно играть с apache и PHP, но на реальном сервере вы действительно избегаете длинных опросов PHP -> Apache.

Вам необходимо использовать что-то вроде среды комета для масштабируемого решения

2 голосов
/ 07 июля 2011

Ваш PHP-скрипт может жить не так долго, в зависимости от ограничения по времени .Итак, не забудьте (пере) установить ограничение по времени.В противном случае я не вижу проблем с увеличением времени.

Что касается того, как долго должен быть usleep, это то, что вам нужно для себя оценить.Более короткий микросон увеличивает нагрузку на сервер, но быстрее находит результаты.Что уместно, во многом определяется остальной частью вашего приложения и вашими ресурсами.Возможно, вы даже захотите изменить время микросон в зависимости от нагрузки на сервер (то есть сделать его дольше, когда нагрузка на сервер высока).

1 голос
/ 27 мая 2016

Что такое длинный опрос

Код, который вы представили, не является длинным опросом. Длинный опрос - это когда вы позволяете клиентам ждать чего-либо и позволяете вашему пользовательскому интерфейсу мгновенно реагировать на события на сервере.

Клиент делает обычный ajax-запрос. Код вашего сервера может подождать или сразу же ответить.

Если возвращать нечего (пока), ответ просто длится дольше. Если и когда происходит какое-то ожидаемое событие, он немедленно отправляет ответ.

Клиент опрашивает ваш ajax-запрос, который не отвечает, пока не произойдет какое-либо событие, но когда это событие происходит, он отвечает мгновенно. Ожидается, что клиент сразу же развернется и сделает еще один длинный запрос на опрос.

Предотвращение пропущенных событий

По этой причине вы обычно используете порядковый номер в протоколе длинных опросов. Каждому событию присваивается порядковый номер, и более новые события имеют более высокие порядковые номера, чем более старые события. Если вы можете организовать это, тогда вы можете сделать длинный опрос запросом «получить события с идентификатора». Если есть события, которые они пропустили, он вернет их немедленно. Если вам дали последний порядковый номер, возвращать нечего, так что не возвращайте никакого ответа, просто сделайте это дольше.

Если между длинными опросами проскользнет несколько событий, ваш опрос вернет несколько записей о событиях.

Для вашего кода требуется некоторый способ, который уведомляет событие, чтобы уведомить код, который ожидает отправки ответа. Это можно реализовать в виде опроса с разумной скоростью в хранилище значений ключей, какого-то рода межпроцессных обменов или чего-то достаточно легкого для повторного использования.

Ваши возможности в PHP несколько ограничены из-за его модели процесса. В nodejs или другой однопроцессной серверной архитектуре вы можете использовать простой массив ответов, ожидающих результатов, и вызывать их все, учитывая параметр каждого из них, поскольку происходит новое событие.

Классический пример

Клиент чата является классическим примером этого. Все люди на странице чата проводят долгие опросы, сидящие там, чтобы получить ответ. Страница работает нормально, просто сетевой запрос занимает время в фоновом режиме.

Когда кто-то печатает сообщение, он отправляет его на сервер, и обработчик для этого вставляет сообщение со следующим идентификатором. Все длинные опросы заметят, что новая запись больше, чем искомое значение «поскольку», и они немедленно отправят ответ для всех записей с идентификатором, превышающим параметр «с тех пор». По сути, уведомляет всех других участников чата в течение короткого времени, не заставляя их постоянно проверять наличие новых сообщений.

1 голос
/ 07 июля 2011

Когда вызывается usleep (), php ничего не делает, пока не истечет сон.

Обычно максимальное время выполнения скрипта по умолчанию составляет 30 секунд, но sleep () и usleep () будут работать дольше, потому что технически PHPне контролирует работу в спящем режиме.

Никогда не пробовал больше нескольких минут - и никогда не возникало проблем.

Потенциально, если что-то занято и много потоков переходит в спящий режим.- вы можете исчерпать потоки для обработки других запросов ...

0 голосов
/ 05 сентября 2013

Общий интервал ответа более 20 секунд сделает ваше приложение подверженным тайм-аутам браузера.Держите его на уровне или ниже 20 секунд - просто чтобы быть в безопасности.

0 голосов
/ 07 июля 2011

Вы действительно должны изучить использование Node и Socket.io. :)

...