PHP非同步呼叫的實現方式

來源:互聯網
上載者:User
比如現在有個需求,就是給大量使用者發送郵件:

$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為了相容各種虛擬機器主機曾經這麼幹過:

頁面下面掛個

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.