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タグ(私の場合は<!> lt; br / <!> gt;)を追加することで解決しました。
Chromeは、再レンダリングをトリガーする前に、表示されている要素 が閉じるのを待っていると思います。それは推測にすぎません。
1024バイトを必要とするようには見えませんでした-動作したときは512バイト未満であったと思います。
アイデアを試すために、現時点でChromeにアクセスできたらいいのにと思います。 </script>
の後にHTMLを追加して、インクリメンタルにレンダリングされるかどうかを確認しましたか?私はそれを想像しますが、そうであれば、Chromeがページの読み込み中に<script>
要素でjavascriptを実行したくないという証拠になります。もちろん、マークアップをレンダリングすると、スクリプトが実行される可能性があります。そうでない場合は、javascriptを外部ファイルとして含めて、実行時間に影響するかどうかを確認できます。
ブラウザは、特にページの読み込み時に、JavaScriptの実行を開始するときの仕様に応じて、ある程度の余裕があると思います。これをポーリングなしで完全にクロスブラウザで実行することは不可能かもしれません。
Chrome開発者と話しましたか?それに関するバグをオープンしましたか?最善の解決策は、Chromeを回避策ではなく、他のブラウザーのように動作させることです。
さて、実際にはおそらく短期的な回避策が必要になるでしょう。しかし、HTTP、HTML、CSS処理など、各ブラウザーが各側面で異なる動作をする世界を想像してみてください...快適な場所ではないでしょう!
ストリームは機能しています。まぶたからの答えは解決策です。
print <!> quot; 2048ポイント[BR <!> gt; \ n <!> quot ;;
[= <!> lt;
ところで、ユーザーエージェントを見てください。 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バイトのデータを送信します。その後、正常に動作します。また、スクリプトタグは必ずbodyタグに入れてください。奇妙なことは、私の場合、1024バイトを追加すると動作したことです。これがお役に立てば幸いです
上記のプログラムはGoogle Chromeで正常に動作しています。