PHP 非同步執行

最近與同事討論兩個有趣的參數與函式(ignore_user_abort、fastcgi_finish_request),先留個紀錄

ignore_user_abort (預設 off)

  • 用途:當使用者連線中斷時不影響操作

可透過以下方式操作

  • PHP 碼: ignore_user_abort(true);
  • Nginx 設定:fastcgi_ignore_client_abort off;
  • php.ini:ignore_user_abort=0;

但因階層關係,nginx > PHP,但理論上因為 nginx 已經轉發給 PHP 因此應只要在 PHP 做設定便可生效(尚未測試),猜測其預設 off 原因為一般狀況下使用者斷線不應該再為其服務(例:行動網路瀏覽電商商品頁面),但某些狀況下使用者可能希望有個完整執行(例:交易過程),因此若在有這類多種行為複雜的系統,不應該在 config 中建立起全域設定,而應該透過程式來控制特定需要這類行為的功能。

fastcgi_finish_request

  • 用途:PHP 運作在 FastCGI 下可透過其提早回應瀏覽器
  • PHP 碼:fastcgi_finish_request();
  • 與過去使用 flush 更新進度方式有點像,但本質不一樣

結論

在某些運作需要長時間的操作比如上傳圖片進行其他處理、產生大報表等,可同時使用以上兩個功能,讓其可以快速回應前端又可以完整執行,但正確做法建議還是採用任務排程(例:GearmanResque/Resque-Scheduler等),以避免遇到例外狀況的處理不一。

測試程式

function writeBigFile() { 
    $filepath = "/var/www/html/tmp/" . date("YmdHis") . "-" . rand(1000, 9999) . ".txt"; 
    echo $filepath . "<BR>" . PHP_EOL; $file = fopen($filepath, "a+");
        for ($i = 1; $i <= 10000000; $i++) { 
            fwrite($file, $i . PHP_EOL); 
        } 
}

ignore_user_abort

echo json_encode(array("status" => "ok"), true);
ignore_user_abort(true); // 加與不加 {"status": "ok"} 都會等到 writeBigFile() 執行完才顯示,但該函式可確保使用者中斷後持續把任務完成 
writeBigFile();

fastcgi_finish_request

echo json_encode(array("status" => "ok"), true);
fastcgi_finish_request(); // 該函式會讓 {"status": "ok"} 先回應使用者 
writeBigFile(); 

參考資料

640 comments

  1. Hi there! I could have sworn I’ve visited this site
    before but after browsing through a few of the posts I realized it’s new to me.
    Regardless, I’m definitely pleased I came across it and I’ll be book-marking it and checking back frequently!

  2. [url=http://bit.ly/2hiePjo]BrainRush[/url] – натуральное средство на основе мицелл, вытяжек и концентратов лекарственных растений с добавлением глицина, биотина и комплекса витаминов В.
    Улучшает передачу нервных импульсов и работу всех отделов головного мозга, помогает при нарушениях функции памяти.
    BrainRush легко усваивается организмом и начинает действовать максимально быстро, дополнительно воздействует на функции эндокринной, имунной и нервной систем.
    Эффективен в любом возрасте.

    [url=http://tinyurl.com/yb9h9jty]BRAINRUSH[/url] – ЭТО УНИКАЛЬНОЕ СЕРТИФИЦИРОВАННОЕ СРЕДСТВО

    Не содержит ГМО Не содержит вредных для здоровья красителей.
    Не содержит вредных для здоровья консервантов.
    Не имеет противопоказаний.
    Запатентованный синергический фитокомплекс.

    [url=http://ow.ly/DzTd30e46cE]BRAINRUSH[/url] исключительно натуральные компоненты, не наносящие вреда организму.
    Активные вещества корневища солодки, шалфея и пустырника пятилопастного повышают устойчивость нервных клеток к кислородному голоданию, активизируют
    умственную деятельность, способствует улучшению памяти и сна.

  3. Были заплачены деньги 6000 за покупку базы данных и просто швырнул. с другого аккаунта к нему обратились, уже специально на 100р была сделка на выборку и тоже швырнул.

    непорядочный гандон. кинет 100р%

    Телеграм @japoshka кидальная дешевка

  4. Just wish to say your article is as astounding. The clearness for your put up is simply nice and that i can suppose you’re an expert on this subject.
    Fine with your permission let me to seize your feed to keep up to date with forthcoming post.
    Thanks a million and please continue the gratifying work.

  5. Hi, i feel that i saw you visited my weblog thus i came to go back
    the prefer?.I am attempting to in finding issues to improve my website!I guess its good enough to
    use a few of your ideas!!

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

*