Google Chrome и потоковые HTTP-соединения?
-
04-07-2019 - |
Вопрос
Google Chrome не работает так же, как другие браузеры, при обнаружении этого слепка:
<?php
while (true) {
echo "<script type='text/javascript'>\n";
echo "alert('hello');\n";
echo "</script>";
flush();
sleep(5);
}
?>
Похоже, что он ждет завершения соединения, прежде чем что-либо предпринимать.
Кроме опроса, как я могу сделать подобное в Google Chrome?
Решение
Некоторые браузеры требуют загрузки определенного количества байтов перед отображением доступных данных. Я помню, как в прошлый раз, когда я пытался сделать то, что вы делаете, мне пришлось выбросить что-то вроде 300 пробелов, чтобы браузер с этим справился.
Другие советы
У меня была похожая проблема, и я решил ее, добавив тег HTML (в моем случае < br / >) перед каждым сбросом.
Я полагаю, что Chrome ожидает закрытия элемента , который отображается , перед повторным рендерингом. Это всего лишь предположение.
Кажется, для этого не требовалось 1024 байта - думаю, у меня было бы чуть меньше 512 байтов, когда это работало.
Хотелось бы, чтобы у меня был доступ к Chrome, чтобы проверить некоторые идеи. Вы пытались добавить HTML после </script>
и посмотреть, будет ли он отображаться постепенно? Я полагаю, что это будет, и если это так, это будет доказательством того, что Chrome не хочет запускать javascript в элементах <script>
во время загрузки страницы. Конечно, рендеринг разметки может запустить ваши скрипты. Если нет, вы можете попробовать включить JavaScript в качестве внешних файлов и посмотреть, влияет ли это на время выполнения.
Я думаю, что браузеры, как правило, имеют некоторую свободу действий в соответствии со спецификацией, когда они начинают выполнять javascript, особенно при загрузке страницы. Это может быть невозможно сделать полностью кросс-браузерным способом без опроса.
Вы общались с разработчиками Chrome? Вы открыли ошибку об этом? ИМХО, лучшее решение - заставить Chrome вести себя так же, как другие браузеры, вместо того, чтобы обойти его. Р>
Хорошо, на самом деле вам, вероятно, понадобится краткосрочный обходной путь. Но представьте себе мир, в котором каждый браузер ведет себя по-разному в каждом аспекте, скажем, HTTP, HTML, CSS-обработка ... это не будет приятным местом!
Поток работает. Ответ от отсутствия век - это решение.
распечатать " 2048 баллов [BR > \ n " ;;
[= <
Кстати, посмотрите на агента пользователя. Safari тоже нужно много байтов. Я думаю, 1024. Firefox нужно не так много байтов.
<?php
$i = 0;
while (true) {
if($i == 0) {
echo "<html><body>";
}
echo "<script type='text/javascript'>\n";
echo "alert('hello');\n";
echo "</script>";
if($i == 0 ) {
$padstr = str_pad("",2048," ");
echo $padstr;
echo "</body></html>";
}
flush();
sleep(5);
$i = $i + 1;
}
?>
В первый раз отправьте не менее 2048 байтов данных. тогда все будет работать нормально. И не забудьте сохранить тег script в теге body. Странно то, что в моем случае, если я добавлю 1024 байта, это сработало. Надеюсь, это поможет вам
Вышеуказанная программа работает нормально в Google Chrome.