[PHP] 背景執行的需求設計與方法

本篇文章更新時間:2023/08/14
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


前端網頁請求後要是處理需要一段時間,而使用者有可能會等不下去而關網頁怎麼辦?

ignore_user_abort(true); 呼叫這段方法,可以忽略使用者關閉網頁的事件。有時候也不一定是使用者關閉,可能程式運作超過伺服器設定的時間被中斷也算!

既然要等一段時間,或許直接請他晚點回來查看結果或是完成後主動通知(Email, SMS...等)的設計,可能也會花一段時間,這時要讓執行時間拉長,避免碰到執行太長時間被停止作業。

set_time_limit(0); 設定無限制執行時間。

如果會需要使用不小的記憶體,來避免記憶體限制導致的中斷。

ini_set("memory_limit", "-1"); 臨時改記憶體使用限制。

以上三大點是,讓一個 PHP 程式在「非 CLI,指令模式下執行時」接受背景處理請求時的起手式。不過這邊後兩點有一定的危險性在,也就是當記憶體沒有控制好使用量,沒有設定中斷點,又因為沒有設定中斷執行時間,就會導致這支程式成為一個巨大吃資源的怪獸。

而在打開了「背景執行,不會因為請求中斷而被迫中斷執行」後,如何處理資料就有不少延伸做法。

但關鍵是「掌握執行狀態」,確保不會陷入無法掌控的執行黑洞。而這塊就是關係到程式架構的設計了。

大部分的背景執行環境應該都不需要進入到「多執行緒」來處理,如果有對外請求的需求,也只要選擇避開會阻塞(blocking)的 cURL 方式,改用其他做法 curl_multi_init包裝 就可以解決。

PHP 多執行緒相關作業的參考資料可以用 pcntl_fork, nohup, pthreads 等關鍵字找到。

但子行程的作業需求真的不多,還有其他實現方式可以參考,不會建議放在第一個選項裡。

最關鍵的是:這些關鍵字的做法,都間接拉高了程式執行環境需求,沒開放系統指令呼叫的環境不能用、沒這指令與方法的環境也不能用。

但其實要實現「背景多工」概念還可以從 HTTP 請求下手,自己發 HTTP 請求給自己的意思。儘管會有些網路因素造成的意外,但還是可以透過流程設計來確保穩定度。算是在這類型「背景」處理中,看到最能夠相容於大部分環境的做法了!

而剩下不需要多工的需求,就是進入背景處理後,慢慢逐步完成,然後透過一些資料更新等通訊設計,來達成掌握目前背景執行狀態追蹤,基本的 AJAX 請求來去更新執行狀態到前端顯示就很足矣。

參考資料:

  1. Connection handling
  2. Easy way to close connections to the browser and continue processing on the server.
  3. 原生PHP代码实现耗时任务后台异步伪并发执行

Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

參與討論

2 則留言

  1. 自動引用通知: [PHP] 緩處理的快速回應方式 - 一介資男
  2. 自動引用通知: [PHP] 緩處理的快速回應方式 | 一介資男

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon