最近要做群發簡訊和群發電郵的程式,因為某些限制,都是多次去請求響應的介面,達到群發的效果。
然後就出現了這樣的問題:我需要給100個客戶發電郵,介面的回應時間平均在2s,然後我的php需要對介面進行100次post操作,長達200s,然後頁面就逾時了……
在不改動PHP設定的前提下,如何解決這個問題?
我自己能想到兩個方案:
- 每次post一個,然後頁面跳轉,就像國內某些開來源程式產生靜態頁那樣,每次只做一個小請求,比如10s可以完成五次post,然後跳轉到新頁面,傳入start=10 start=15這樣的參數,不斷跳轉跳轉重新整理重新整理,最後完成這個任務。缺點是這樣需要用戶端一直守著瀏覽器……
- 把發送訊息的任務存在資料庫裡,做一個send.php之類的檔案,每次取一個或幾個訊息去發送,然後用crond或者計劃任務每秒之行send.php檢查有沒有新任務,有的話就執行任務。
我想知道還有沒有別的簡單易行的方法,比如我曾經聽說過rabbitMQ什麼的,但是沒弄明白。。。
回複內容:
最近要做群發簡訊和群發電郵的程式,因為某些限制,都是多次去請求響應的介面,達到群發的效果。
然後就出現了這樣的問題:我需要給100個客戶發電郵,介面的回應時間平均在2s,然後我的php需要對介面進行100次post操作,長達200s,然後頁面就逾時了……
在不改動PHP設定的前提下,如何解決這個問題?
我自己能想到兩個方案:
- 每次post一個,然後頁面跳轉,就像國內某些開來源程式產生靜態頁那樣,每次只做一個小請求,比如10s可以完成五次post,然後跳轉到新頁面,傳入start=10 start=15這樣的參數,不斷跳轉跳轉重新整理重新整理,最後完成這個任務。缺點是這樣需要用戶端一直守著瀏覽器……
- 把發送訊息的任務存在資料庫裡,做一個send.php之類的檔案,每次取一個或幾個訊息去發送,然後用crond或者計劃任務每秒之行send.php檢查有沒有新任務,有的話就執行任務。
我想知道還有沒有別的簡單易行的方法,比如我曾經聽說過rabbitMQ什麼的,但是沒弄明白。。。
放在背景工作執行是一個好辦法,應該也是最好的方法,不需要rabbitMQ,這隻會讓問題複雜化。但實際上有個方法可以讓你的php不逾時,即使使用者瀏覽器串連斷開了,它也會繼續執行下去,那就是在你的php檔案最開始加上以下兩行
ignore_user_abort(true);set_time_limit(0);
rabbitMQ和你提供的第二種方案類似,唯一不同的就是,你的方案需要不斷的掃描任務表,資料量大的情況下,負載會很高,效率比較低。
使用rabbitMQ的話就是有任務你就處理,就是常說的訊息驅動。訊息驅動這項技術在需要非同步處理的程式中很常見。屬於一種高效的方案。你可以獨立出一個任務系統,專門來處理需要非同步處理比較耗時的業務,像郵件的發送,文檔、視頻的轉換,圖片的處理等等。這個方案其實很清晰,很簡單。
希望能給你帶來參考。
我現在的做法是這樣的。用其他語言,如:.NET寫一個郵件佇列服務。然後PHP用SOCKET的方式POST但是不等待。剩下的事情交給.NET那邊來做。
需要考慮的因素是:
1. 對及時性要求高不高?
2. 什麼情況下觸發需要群發 EMAIL 的動作?
方案一: 先把請求收集入庫, 每一個頁面請求的時候處理一個請求, 分髮式處理, 適合一般的 web 應用, 不清楚你的狀況, 如果是每一個頁面請求都需要觸發群發 EMAIL 的動作的話 ... ;
方案二: 如果對及時性要求不高的話, 可以系統工具如 cron , 首先把請求收集起來入庫, 寫一個處理請求的指令碼, 在淩晨的時候伺服器負載不高的情況下利用 cron 執行此指令碼.
在2的方案裡面,如果量不大是沒問題的,
如果量大了,還是得考慮基於訊息佇列(mq,redis),在後台多個消費程式同時消費(發送)
我們系統每天百萬的簡訊發送基本就是這麼做!