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(); 

參考資料

851 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!!

  6. Nice post. I was checking constantly this blog and I’m impressed!
    Extremely helpful information specially the last part 🙂 I care for such info much.
    I was seeking this particular information for a long time.

    Thank you and best of luck.

  7. This is the right blog for everyone who would like to understand this topic.
    You know so much its almost hard to argue with you (not
    that I personally would want to…HaHa). You certainly put a new spin on a subject that’s been discussed for many years.
    Great stuff, just great!

發表迴響

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

*