1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

レスポンスはすぐ返して、処理は裏で継続する方法:メールの送信など重い処理に

Posted at

ログインなどでタイムラグがあってはいけないときなど、レスポンスだけはすぐに返したいときがあります。別プロセスで走らせればいいやんといったらその通りなのですが、バックエンドにめちゃくちゃ弱い僕は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!");

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?