PHPスクリプトは、HTTPリクエストが終了したとブラウザに思い込ませることができますか?
-
07-07-2019 - |
質問
最初に、HTTP要求が終了した後でも実行するようにスクリプトを構成します
ignore_user_abort(true);
その後、テキストをフラッシュします。
echo "Thats all folks!";
flush();
ブラウザでHTTPリクエストが終了したと思わせるにはどうすればよいですか?ブラウザで<!> quot; page loading <!> quot;を表示せずに、自分で作業を続けることができます。
header(??) // something like this?
解決
これを行う方法は次のとおりです。ブラウザは、出力の最初のN文字を読み込んでから接続を閉じるように指示しますが、スクリプトは完了するまで実行を続けます。
<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Will not work
flush(); // Unless both are called !
// At this point, the browser has closed connection to the web server
// Do processing here
echo('Text user will never see');
?>
他のヒント
ヘッダーは機能しません(ヘッダーなので、先頭になります)
スクリプトを終了せずにhttp接続を閉じる方法はわかりませんが、それを行うためのあいまいな方法があると思います。
リクエストが完了した後にあなたがやりたいことを私たちに教えてくれると、より良い提案をするのに役立ちます。
しかし、一般的に、私は次のいずれかについて考えているでしょう:
1)次のような簡単なコマンドラインスクリプトを実行します(exec()を使用):
#!/bin/sh
php myscript.php <arg1> <arg2> .. <argN> &
次に、次のようなhttpバインドスクリプトから開始します。
<?PHP
exec('/path/to/my/script.sh');
?>
または:
2)別のプログラム(継続的に実行されるデーモン、または頻繁にcronされるスクリプト)を作成し、リクエスト内のコードが命令を渡す方法を見つけます。キューが機能するデータベーステーブルを用意したり、何らかのフラットファイルで機能させたりすることができます。また、Webベースのスクリプトからコマンドラインコマンドを呼び出して、要求外のスクリプトが作業をキューに入れるようにすることもできます。
1日の終わりに、httpリクエストの後にスクリプトを実行し続けたくない 。 mod_phpを使用していると仮定すると、スクリプトが終了するまでApacheプロセスを結びつけることになります。
おそらく、php.netのマニュアルページにあるこのコメントが役立つでしょう: http://www.php.net/manual/en/features.connection-handling.php#71172
理論的には、HTTP 1.1キープアライブが有効で、クライアントがサーバーから期待する文字数を受信した場合、クライアントはそれを応答の終わりとして扱い、先に進んでページをレンダリングする必要があります(接続を維持したまま)開きます。)これらのヘッダーを送信してみてください(別の方法で有効にできない場合):
Connection: keep-alive Content-Length: n
ここでn
は、応答本文で送信した文字の量です(出力バッファリングはそれをカウントするのに役立ちます)。これを自分でテストする時間がないのは残念です。うまくいく場合に備えて提案を投げかけています。
これを達成する最良の方法は、出力バッファリングを使用することです。 PHPは準備ができてからヘッダーを送信しますが、ob_ *を使用してブラウザーに出力をラップすると、すべての段階でヘッダーを制御できます。
必要に応じてレンダリングされたページをバッファに保持し、中国で太陽が昇るまでヘッダーを送信できます。このため、最近では多くの開始タグ<?php
が表示されますが、終了タグは表示されません。考慮すべきインクルードがある可能性があるため、スクリプトがヘッダーを時期尚早に送信しないようにします。