0

tl; dr: SQLクエリの実行を待っている間に、いくつかの「ダミースペース」を定期的にブラウザにフィードバックすることは可能ですか?これは、何も返されない間、ブラウザがハングアップしないようにするためです。

長い話:

データベースに対して小さな「Webツール」を作成しました(MS SQL、PDOドライバーを使用)。

時々、私が実行するクエリは長い時間がかかります。

約100秒後、ブラウザは「回転」を停止します。何が原因なのかはまだわかりませんが、FirefoxやChromeでも同じです。スタックはPHP5.3、IIS 6、FastCGIです。PHPでもDB/SQLSRVのタイムアウトでもありません。これらの両方を増やしたためです。また、他のクエリでは、すべての結果をフィードバックするのに時間がかかります。(ヘッダーを書き込み、110秒間冷却してから、フッターを書き込むことで問題を再現できます。ヘッダー部分のみが表示されます。)

現在のクエリの問題は、約200秒間何もフィードバックされないことです。その後、すべてが発生します。しかし、これは、そのスタックに沿った何かが約100秒後にリスニング/受信/送信を停止した場合には役に立ちません。

したがって、質問:スクリプトがSQLが戻るのを待っているに、ブラウザにダミースペースを少しずつフィードすることは可能ですか?私のネイティブのJavaのタングでは、これは些細なことですが、PHPでは、1つはAFAIKの完全にシングルスレッド(実際には「シングルプロセス」)です。全体としてはるかに時間がかかる他のスクリプトがあるので、このトリクルが機能することはわかっていますが、結果の小さな部分が継続的にブラウザーに返されます。これは問題なくレンダリングされます。

4

3 に答える 3

2

1 つのクエリのみを実行する場合は、そうではありません。ただし、クエリの性質によっては、クエリを複数の小さなクエリに分割して、それらをループすることができます。

他の回答やコメントとは対照的に、呼び出しを分割すると、ブラウザにデータを「トリクルフィード」できます。あなたはその機能を探していflush()ます。

デモ

<?php

for ($i = 0; $i <= 200; $i++)
{
    sleep(1);
    echo ' ';

    flush();
}

echo 'It worked!';
?>

これを実行してみてください。200 秒かかります。ただし、flush()そこにあるため、ループの反復ごとにデータがブラウザに送信され、タイムアウトにならないことを願っています! 上司の Web ホストは 30 秒間操作がないとタイムアウトになるので (Rackspace、grrrr!)、これとまったく同じトリックを何度も使用する必要がありました。

于 2012-08-08T19:09:24.307 に答える
1

PHP は、出力をエコーし​​てもブラウザーに送信しません。コンテンツをバッファに書き込み、コンテンツ全体を一度にブラウザに送信します。したがって、いいえ、ブラウザに出力を細流にすることはできません。

于 2012-08-08T19:01:19.970 に答える
0

フラッシュはうまくいきませんより良い方法があります - 出力をファイルにパイプしてから、独立したPHPスクリプトを使用して最後の行をリッピングすることができます。最後の行。これはあなたが望む効果を与えます私は今それに取り組んでいます、そして私がするときにここでここでコードを準備します

EDIT1: ハハ エンドレ、あなたです! <3 イギリス出身

EDIT2: タイムアウトは、PHP.ini 内外の微妙なパラメーターの過多に起因します。それらは無関係であると思われるという意味でほとんど文書化されていませんが、ブラウザーが不自由であることを過小評価しないでください。私の経験では、照射することしかできませんでした。 Firefoxで一度だけタイムアウトしますが、この方法で3時間のスクリプトを実行/ポーリングすることできました(悲しいことに、それは私の古い仕事でのAD移行スクリプトであり、コードがありません)

EDIT3: PHP CLI を使用して PHP で「スレッド化」し、プロセス ID または curl を使用して、どちらもかなり ewww ですが、実行できます

于 2014-01-07T11:32:39.797 に答える