比如現在有個需求,就是給大量使用者發送郵件:
$i=0;while ($i < 100000) { send_mail(); //發送郵件實現代碼 $i++;}
對於以上案例代碼的使用者體驗就很差,實際上也沒人會這麼幹,那麼怎樣使用程式後台非同步執行,而又不影響使用者的體驗呢?
求思路...
回複內容:
比如現在有個需求,就是給大量使用者發送郵件:
$i=0;while ($i < 100000) { send_mail(); //發送郵件實現代碼 $i++;}
對於以上案例代碼的使用者體驗就很差,實際上也沒人會這麼幹,那麼怎樣使用程式後台非同步執行,而又不影響使用者的體驗呢?
求思路...
我們使用的是laravel架構 + beanstalkd 隊列,網上有安裝和使用的說明.
youku裡有一個laravel架構的視頻教程,有一章就是講隊列的.
簡單點,你按照那上面來做一遍就行了.
http://v.youku.com/v_show/id_XNzgzNjQ2ODQ0.html
Laravel+Redis也行,你自己先試試,不明白繼續提問.
還有一種方式,你用swoole架構. 用裡面的非同步呼叫.詳見:www.swoole.com
或者更簡單的方式,但不適合你這種情況,但可以參考:http://www.laruence.com/2008/04/14/318.html
你看著三種方式哪種更適合些?
用redis服務 訊息佇列做兩個php進程的之間的通訊,實現多個進程非同步執行
使用訊息佇列。
1、建立一個郵件隊列資料表和一個插入郵件隊列的PHP公用函數
2、在需要發送郵件的地方,調用上面的PHP公用函數,將郵件先寫到郵件隊列中。
3、用crontab建立一個定時任務,定期掃描郵件隊列,如果有未發送的郵件,則進行發送
其實範例程式碼沒有錯,實際上也就是這麼做的,只不過是作為單獨一個進程來執行的,就像樓上幾位說的一樣。但是這依然是用阻塞模式啟動並執行。
redis隊列和php多進程,和一樓思路一樣的,之前項目中也是用的這種方式。
推薦Gearman,百萬級生產環境跑過。
我們的shopex為了相容各種虛擬機器主機曾經這麼幹過:
頁面下面掛個