多線程 - PHP怎麼做批量的發送請求!!!!

來源:互聯網
上載者:User
比如說這麼一個web後台頁面,要有一個操作,對幾萬使用者發送郵件或者發送推送~要怎麼做才能調到php去而且不影響這個操作後的其他動作呢?因為php 這種請求是串列處理的,調用一個函數方法等只有跑完下來才能退出,如果用迴圈發送,那在發送的時候就只能卡在這個頁面不能進行其他動作了,而且找過類似java的多線程實現方法~調一個方法迴圈發送,然後主進程退出來,調一個介面查看發送的狀態,發送了多少,結果是不行的,因為PHP只能平行處理這種web的請求~這個跟php用來做app介面的時候的高並發調用是不同的,因為當php作為這種資料請求的時候,是屬於不同使用者調用~apache可以做並行~所以要怎麼實現呢?

回複內容:

比如說這麼一個web後台頁面,要有一個操作,對幾萬使用者發送郵件或者發送推送~要怎麼做才能調到php去而且不影響這個操作後的其他動作呢?因為php 這種請求是串列處理的,調用一個函數方法等只有跑完下來才能退出,如果用迴圈發送,那在發送的時候就只能卡在這個頁面不能進行其他動作了,而且找過類似java的多線程實現方法~調一個方法迴圈發送,然後主進程退出來,調一個介面查看發送的狀態,發送了多少,結果是不行的,因為PHP只能平行處理這種web的請求~這個跟php用來做app介面的時候的高並發調用是不同的,因為當php作為這種資料請求的時候,是屬於不同使用者調用~apache可以做並行~所以要怎麼實現呢?

這個問題已經找到一個比較簡單不用引用庫的解決辦法了.
http://www.htmlgoodies.com/beyond/javascript/providing-feedback-on-long-running-scripts-in-older-browsers.html
貼出一個網址.
方法的原理是利用session_write_close()函數,當一個長迴圈在跑的時候,在長迴圈中加入session_write_close(),關閉一下session~由於php的web service 是針對同一session使用者串列的,關閉一次session相當於拋出一次鎖,其他服務就可以排隊拿到這個鎖執行程式~
總的來說相當於一個長迴圈中每次拋出鎖,可以插入其他動作,這樣就實現了切換運行~

我目前的做法是,借用redis的隊列,把要發送的訊息,全部放到裡面,然後就不管了
有一個後台發送進程,來處理隊列裡面的資料
1.如果需要重發,則把發送失敗的訊息放到一個備份的隊列裡,每次迴圈開始前,都把備份隊列裡的資料放到發送的隊列裡。
2.php進程不建議常駐,因此,可以把一個進程的生命週期設定為1min,再借用cron來實現進程的重啟

對接一個訊息佇列,把你要處理的任務放入訊息佇列,簡單的可以用redis,複雜點的可以beanstalkd, rabbitmq等
如果堅持用PHP實現,寫CLI指令碼去這個訊息佇列拿訊息,拿到訊息之後處理你的耗時任務
亦可使用其它技術實現,python,java,看你們團隊的實際情況和技術棧

PS: PHP有多任務的解決方案,用pthread擴充實現多線程或者pcntl擴充實現多進程,但也不要在web端做這個事情

這個可以借用訊息佇列做非同步處理, 你web後台只是做個觸發, 真正的郵件之類的通知,要到非同步處理, 這樣不會堵塞你web背景操作,訊息佇列的話,有很多種方案, 簡單點的就是利用redis自己實現一個,或者網上有類似的。
隊列處理髮送訊息的動作的時候, 你可以根據你業務的重要, 比如, 我發送一次,不管成功不成功,無所謂,還是必須把訊息發送成功, 必鬚髮送成功的話, 你可以把失敗的, 寫到另外隊列,做處理,或者做log記錄之類的, 這個跟公司業務比較接近了。

use swoole

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.