首頁  >  文章  >  後端開發  >  線程池 - 想用php發送郵件然後記錄發送結果,目前用的redis,用一個腳本執行發送和記錄操作,很慢,有什麼更好的方法嗎

線程池 - 想用php發送郵件然後記錄發送結果,目前用的redis,用一個腳本執行發送和記錄操作,很慢,有什麼更好的方法嗎

WBOY
WBOY原創
2016-09-27 14:18:11993瀏覽

目前是用的一個php腳本,執行請求外部介面發郵件,然後等郵件返回,得到處理結果,然後往自己的資料庫記錄發送結果。 。
一個小時大概可以處理2w條,太慢了。 。

老闆說用線程池來做,我現在又是一臉懵逼。 。不太懂具體的做法,有大神能說一下大概的過程嗎?是用Thread這個擴充嗎?

回覆內容:

目前是用的一個php腳本,執行請求外部介面發郵件,然後等郵件返回,得到處理結果,然後往自己的資料庫記錄發送結果。 。
一個小時大概可以處理2w條,太慢了。 。

老闆說用線程池來做,我現在又是一臉懵逼。 。不太懂具體的做法,有大神能說一下大概的過程嗎?是用Thread這個擴充嗎?

剛好做過類似的事情,可以提點意見。
2w/h ≈ 5.55 QPS,的確不高。

如果照你老闆的思路,一個單執行緒的腳本執行慢,那就多幾個。那你需要的是 pthreads 擴充(多執行緒),或是直接開多個行程處理(pcntl擴充甚至直接 exec 都可以)。

但從你的需求來看,使得佔用處理時間的主要內容是外部 IO 等待。可以考慮使用並發同時發送多封郵件(例如 multi_curl),或非同步發送郵件(例如 curl 的 async),或整體使用個非同步服務(例如 swoole 擴充)

資料表增加一個欄位process_id
插入資料庫記錄的時候隨機為process_id 賦值mt_rand(1,10)
開啟10 個PHP 腳本,
第一個腳本處理process_id 為1 的記錄:select * from send_email_list process and status=0
第二個腳本處理process_id 為2 的記錄:select * from send_email_list where process_id=2 and status=0
這樣同時10 個進程處理,這是最簡單直接的方法,讓你的處理速度直接提升10 倍。

多線程,multi_curl 並發, swoole 非同步都是可行解決方案。但上面的方案只需要在現有基礎上進行簡單改動便可以實現,可能更適合題主。

用nodejs來做後台發送郵件服務

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn