PHP實現非同步操作總結

安全劍客發表於2019-09-03
1.為啥PHP需要非同步操作?

一般來說PHP適用的場合是web頁面展示等耗時比較短的任務,如果對於比較花時間的操作如resize圖片、大資料匯入、批次傳送EDM、SMS等,就很容易出現操作超時情況。你可以說我可以設定無限超時時間,等等你也要知道PHP有一個工作模式是fastcgi,PHP無限不超時,不代表 fastcgi相應不超時……如果你還想說要fastcgi相應永不超時,我建議你應該跟你們的運維人員討論去……你會得到的回覆將是fuck you!!!!!

這個時候非同步的操作就發揮他的作用了,由於是非阻塞操作,操作會即時返回,然後在後臺再慢慢幹活。管你超時不超時的,我就沒有在當前的程式/執行緒下幹活。看吧是不是很美好,不過其實這也是個坑……

2.PHP可以實現非同步操作嗎?

答案是肯定的,不過網上各種的純PHP實現得就有點彆扭了。socket模式、掛起程式模式、有的還直接fork程式。很好,各路神仙各顯神通。如果運維人員看到的話,一定會你們的,不把web server跑死才怪……

那還有其他更好的方法去實現這個非同步操作的可能麼?有,現在我們只有想怎麼開外掛了。查一下PECL主流的外掛方案有一堆的rabbitMQ(訊息佇列),其中有個用於任務分配的外掛進入了我們的視線Gearman(其實這傢伙才是角,我就不詳細介紹了,gearman )。

3.為啥選擇Gearman?

別的不說,就說他的client多,支援很多語言的client,你可以使用大部分你喜歡的語言去寫worker。我個人是很煩語言之爭,你喜歡用神碼語言寫worker都隨你喜歡。有資料持久化支援(就是把佇列儲存到資料庫介質中,那故障恢復也好做),有群集支援(其實很多rabbitMQ都有這些功能)。 PECL上有擴充套件,也有純PHP實現擴充套件。反正這個Gearman也活了很久了,雜七雜八的問題都基本上解決了。
有了Gearman這外掛就簡單多了。就是向gearman傳送一個任務,把執行的任務發出去,然後等待worker去呼叫PHP cli去執行我們的php程式碼。

4.結論

經過以上配置犀牛一樣大的傢伙後(要裝一個Gearman,還要跑個Py ),我們基本上就使PHP擁有了非同步呼叫功能,當然其中還有一個狀態維護神馬的要自己去實現。所以發現,其實這個方案不咋樣,太複雜了。還是使用一些web service的方式去做web callback會好點(問題是web callback一樣會超時……)。

原文連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2655910/,如需轉載,請註明出處,否則將追究法律責任。

相關文章