PHP實現非同步操作總結
一般來說PHP適用的場合是web頁面展示等耗時比較短的任務,如果對於比較花時間的操作如resize圖片、大資料匯入、批次傳送EDM、SMS等,就很容易出現操作超時情況。你可以說我可以設定無限超時時間,等等你也要知道PHP有一個工作模式是fastcgi,PHP無限不超時,不代表 fastcgi相應不超時……如果你還想說要fastcgi相應永不超時,我建議你應該跟你們的運維人員討論去……你會得到的回覆將是fuck you!!!!!
這個時候非同步的操作就發揮他的作用了,由於是非阻塞操作,操作會即時返回,然後在後臺再慢慢幹活。管你超時不超時的,我就沒有在當前的程式/執行緒下幹活。看吧是不是很美好,不過其實這也是個坑……
答案是肯定的,不過網上各種的純PHP實現得就有點彆扭了。socket模式、掛起程式模式、有的還直接fork程式。很好,各路神仙各顯神通。如果運維人員看到的話,一定會你們的,不把web server跑死才怪……
那還有其他更好的方法去實現這個非同步操作的可能麼?有,現在我們只有想怎麼開外掛了。查一下PECL主流的外掛方案有一堆的rabbitMQ(訊息佇列),其中有個用於任務分配的外掛進入了我們的視線Gearman(其實這傢伙才是角,我就不詳細介紹了,gearman )。
別的不說,就說他的client多,支援很多語言的client,你可以使用大部分你喜歡的語言去寫worker。我個人是很煩語言之爭,你喜歡用神碼語言寫worker都隨你喜歡。有資料持久化支援(就是把佇列儲存到資料庫介質中,那故障恢復也好做),有群集支援(其實很多rabbitMQ都有這些功能)。 PECL上有擴充套件,也有純PHP實現擴充套件。反正這個Gearman也活了很久了,雜七雜八的問題都基本上解決了。
有了Gearman這外掛就簡單多了。就是向gearman傳送一個任務,把執行的任務發出去,然後等待worker去呼叫PHP cli去執行我們的php程式碼。
經過以上配置犀牛一樣大的傢伙後(要裝一個Gearman,還要跑個Py ),我們基本上就使PHP擁有了非同步呼叫功能,當然其中還有一個狀態維護神馬的要自己去實現。所以發現,其實這個方案不咋樣,太複雜了。還是使用一些web service的方式去做web callback會好點(問題是web callback一樣會超時……)。
原文連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2655910/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PHP非同步操作原理及實現PHP非同步
- JS中的非同步操作總結JS非同步
- [php]php總結(1)PHP
- [php]php總結(2)PHP
- 多程式PHP指令碼實現海量資料轉移總結PHP指令碼
- Kotlin 非空性總結Kotlin
- 超實用PHP函式總結整理PHP函式
- php總結_1PHP
- PHP策略模式在業務的實踐總結PHP模式
- 主流動畫實現方式總結動畫
- PHP課程總結PHP
- PHP面試題總結PHP面試題
- ***php除錯總結PHP除錯
- php函式總結PHP函式
- PHP 使用連結串列實現對映PHP
- 資料結構之php實現棧資料結構PHP
- 跨域方案總結與實現跨域
- 面試題總結:HashMap實現原理面試題HashMap
- 前端模板引擎的實現總結前端
- php實現基本資料結構之連結串列PHP資料結構
- PHP設計模式總結PHP設計模式
- 跨域總結(jquery,php)跨域jQueryPHP
- PHP面試問題總結PHP面試
- PHP常用函式總結PHP函式
- php 常用函式總結PHP函式
- 研究c#非同步操作async await狀態機的總結C#非同步AI
- 非對稱加密和證書總結加密
- Laravel 結合 Redis 實現 PHP 定時器LaravelRedisPHP定時器
- 資料結構之php實現陣列資料結構PHP陣列
- 資料結構之php實現佇列資料結構PHP佇列
- 資料結構之php實現單向連結串列資料結構PHP
- [資料結構]連結串列的實現在PHP中資料結構PHP
- [資料結構] 連結串列的實現在 PHP 中資料結構PHP
- Vue許可權路由實現總結Vue路由
- Promise 小小的總結與實現Promise
- 推薦ABTest的實現策略總結
- PHP新手總結的PHP基礎知識PHP
- MaxCompute讀取分析OSS非結構化資料的實踐經驗總結