ログインなどでタイムラグがあってはいけないときなど、レスポンスだけはすぐに返したいときがあります。別プロセスで走らせればいいやんといったらその通りなのですが、バックエンドにめちゃくちゃ弱い僕はexec()なんて関数は知りません。知っていても使うと、ミスって永遠にプロセスが落ちなくなりそうです。。
そこで探したらいい感じの実装方法がありました!でも初心者の調べた範囲なので実装するときはちゃんと自分で調べてください(自己責任でお願いします)。あと、ご指摘もよろしくお願いします。
コードサンプル
PHP
<?php
ignore_user_abort(true); // レスポンス後も処理を続行できるように
set_time_limit(100); // ずっと走ると怖いので 100 秒後にタイムアウト
ob_start(null, 0, PHP_OUTPUT_HANDLER_FLUSHABLE | PHP_OUTPUT_HANDLER_REMOVABLE); // 出力をバッファっていう感じで制御できるように、好きなタイミングで吐けるようにオプションをつけておく
print "Hello, Qiita!"; // なんか出力する
// echo "\r\n"; // うまくいかないときは改行させて
header( 'Content-length: ' . ob_get_length() ); // 文字数をヘッダに出力
header("Connection: close"); // コネクションを切る
while (ob_get_level() > 0) { // バッファが溜まってたら
ob_end_flush(); // 出力して終了
}
flush(); // サーバーから出力
if (session_status() !== PHP_SESSION_NONE) { // セッションが始まってたら
session_commit(); // セッションを保存
}
// 重い処理
sleep(5);
file_put_contents("./example.txt", "Hello, File!");
参考文献
- PHP オンラインマニュアル(2021/7/11 参照)
( https://www.php.net/manual/ja/function.ignore-user-abort.php 、 https://www.php.net/manual/ja/ref.outcontrol.php 、 https://www.php.net/manual/ja/function.flush.php ) - PHPでレスポンスを出力した後に処理を続ける方法 - 昼メシ物語(2021/7/11 参照)
( https://blog.mirakui.com/entry/20090313/1236961372 ) - 【PHP】レスポンスを返した後も処理を続ける - stylagy(2021/7/11 参照)
( https://ameblo.jp/stylagy/entry-12425262997.html )