php本身是沒有非同步,但我們經常會需要處理一些耗時操作,如公號推送給所有使用者。試過很多方法都沒有做到,每一條推送一個網路請求,curl每次好像最少一秒,請求次數多肯定不行。fscokopen post json資料沒解決,一直出現post data empty,請各路高手支招,給一些解決方案!
回複內容:
php本身是沒有非同步,但我們經常會需要處理一些耗時操作,如公號推送給所有使用者。試過很多方法都沒有做到,每一條推送一個網路請求,curl每次好像最少一秒,請求次數多肯定不行。fscokopen post json資料沒解決,一直出現post data empty,請各路高手支招,給一些解決方案!
耗時操作就不用放在web上了,你可以用php寫指令碼把耗時操作放進去,然後web上面通過執行指令碼並忽略輸出達到非同步效果,這是我使用的方法,如果你看到有更好的回答,記得 @ 我看一下哈哈哈。下面是範例程式碼:
pclose(popen('/usr/local/php5/bin/php tmp.php &', 'r'));// 繼續你的代碼
可以使用gearman for php
或者swoole 來處理。
可以用訊息佇列
訊息佇列處理耗時任務, gearman php-resque
或者 fastcgifinishrequest
可以藉助用 redis的隊列,實現逐步推送的功能。裡面實現的原理比較簡單, redis執行的速度很快的
把耗時的任務儲存到資料庫,然後專門寫一個PHP CLI進程迴圈處理資料庫裡的任務.
這些耗時的任務不應該在Web上(MOD_PHP,PHP-FPM)執行,以免影響Web服務.
php+rabbitmq,”公號推送給所有使用者“作為一個單獨模組,每次需要發送訊息可以放到訊息佇列裡,之後的都交給rabbitmq處理
同上,php+rabbitmq,”公號推送給所有使用者“作為一個單獨模組,每次需要發送訊息可以放到訊息佇列裡,之後的都交給rabbitmq處理