Как реализовать события, отправленные сервером, в PHP?

Я настроил сервер, отправленный скриптом события с php и циклом while, я не хотел, чтобы скрипт закрывался и должен был повторно опрашивать, поэтому я поместил все это в цикл while.

Проблема заключалась в том, что скрипт зависал, и мне пришлось отказаться от этого маршрута, и вместо этого я использовал серверную часть веб-сокета node.js.

Мой вопрос: если я когда-нибудь возвращался к созданию php-скрипта, отправляемого сервером, как мне его реализовать?
Циклы while, кажется, не обрезают его, поскольку он зависает скрипт, и если он просто подключается и отключается каждый во-вторых, это ничем не отличается от длительного опроса, так как же мне создать PHP-скрипт, который не будет зависать, а также отправлять сообщения SSE?


person Naftali aka Neal    schedule 02.01.2013    source источник
comment
Вы можете добавить sleep() в цикл, чтобы ослабить его.   -  person Musa    schedule 03.01.2013
comment
@Musa Я сделал это безрезультатно. Оно все еще висело.   -  person Naftali aka Neal    schedule 03.01.2013
comment
В чем проблема с этим примером? developer.mozilla.org/en-US/docs/ Server-sent_events/   -  person Luca Rainone    schedule 03.01.2013
comment
@chumkiu Я пробовал это. Он висит.   -  person Naftali aka Neal    schedule 03.01.2013
comment
также с ignore_user_abort(false); ?   -  person Luca Rainone    schedule 03.01.2013
comment
@чумкиу и set_time_limit(0)   -  person Naftali aka Neal    schedule 03.01.2013
comment
У вас есть буферизация вывода или mod_deflate?   -  person Musa    schedule 03.01.2013


Ответы (1)


Похоже, у вас возникла проблема с буферизацией вывода php. Попробуйте добавить эту строку в конец цикла while:

ob_flush();
flush();

Это должно отключить буферизацию вывода.

EDIT Вы также можете завершить скрипт через некоторое время (например, 10 минут), чтобы снизить нагрузку на сервер.

Я создал библиотеку для вас, чтобы сделать это очень легко. Проверьте это здесь.

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

Третье редактирование Если у вас есть обратный прокси-сервер, вы можете попробовать отключить кэширование, чтобы разрешить работу SSE.

В PHP есть и другие способы отключить буферизацию вывода. См. код ниже:

<?php
for($i=0;$i<ob_get_level();$i++){
    ob_end_flush();
}
@apache_setenv('no-gzip',1);
@ini_set('implict_flush',1);
ob_implict_flush(true);
person Licson    schedule 02.01.2013
comment
Это согласуется с ответом, который я дал на аналогичный вопрос: stackoverflow.com/questions/7469396/ - person igorw; 03.01.2013