在實際開發中,郵件發送失敗是一種常見問題,比如服務器暫時故障、網絡中斷、SMTP響應延遲等。為提高系統穩定性,我們可以將郵件任務加入隊列,由獨立的後台進程異步處理,避免阻塞業務流程。
本文以Beanstalkd為例,講解如何搭建PHP郵件隊列。
首先安裝Beanstalkd:
sudo apt-get install beanstalkd
啟動服務:
sudo systemctl start beanstalkd
安裝PHP Beanstalkd擴展:
pecl install beanstalkd
在php.ini中添加擴展配置:
extension=beanstalkd.so
重啟PHP服務:
sudo systemctl restart php-fpm
創建一個用於發送郵件和監聽隊列的類:
class MailQueue { protected $beanstalk; public function __construct() { $this->beanstalk = new PheanstalkPheanstalk('127.0.0.1'); } public function sendEmail($email, $subject, $message) { // 將郵件任務加入隊列$this->beanstalk->useTube('mail_queue')->put(json_encode([ 'email' => $email, 'subject' => $subject, 'message' => $message, ])); } public function handleEmails() { // 監聽隊列並處理郵件發送邏輯while (true) { $job = $this->beanstalk->reserveFromTube('mail_queue'); $data = json_decode($job->getData(), true); // 發送郵件邏輯,這裡省略具體實現$this->sendEmail($data['email'], $data['subject'], $data['message']); // 刪除任務$this->beanstalk->delete($job); } } }
調用類中的方法將郵件加入隊列:
$mailQueue = new MailQueue(); $mailQueue->sendEmail('example@example.com', '郵件主題', '郵件內容');
Supervisor 是一個常用的進程守護工具,可以確保隊列監聽腳本持續運行。
[program:mail_queue_worker] command=php /path/to/mail_queue_worker.php directory=/path/to/project user=www-data numprocs=1 autostart=true autorestart=true process_name=%(program_name)s_%(process_num)02d redirect_stderr=true
將/path/to/mail_queue_worker.php替換為你自己的處理腳本路徑,確保進程在後台持續監聽並處理郵件。
通過PHP結合隊列機制,我們能夠有效規避郵件發送過程中的各類異常問題,實現系統解耦、任務異步和高可用架構。本文以Beanstalkd為例,介紹了從安裝配置、類封裝到實際使用的完整流程,適用於大多數PHP郵件發送場景。