上周寫好的發送郵件的計划任務只發送了一部分,檢查計划任務日志,發現 502 Bad Gateway 的錯誤(已經在腳本中設置了 set_time_limit(0))。
后來在網上查找資料,可以通過以下設置來解決腳本超時導致 502 Bad Gateway 的問題(Nginx + php-fpm,CentOs 系統):
① Nginx 設置
修改 nginx.conf:
fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300;
重啟 nginx。
② php-fpm 設置
修改 php-fpm.conf:
request_terminate_timeout = 0s
重啟 php-fpm:
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
③ 在 php 腳本中設置
ini_set("max_execution_time", 0);
或者在 php.ini 中把 max_execution_time 設為一個比較大的值。
502 問題得到解決。
然而腳本在執行一段時間之后,又報了 504 Gateway Time-out 的錯誤,再適當把 nginx.conf 的 fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout 等數值調大:
fastcgi_connect_timeout 3000; fastcgi_send_timeout 3000; fastcgi_read_timeout 3000;
35 分鍾發 600+ 郵件(PHPMailer)不報 504 錯誤。
另外最好設置一張數據庫表來記錄哪些用戶的郵件已經發送成功,這樣在腳本終止之后重新執行不會重復發送郵件。測試的時候可以用 126 郵箱(同一 QQ 郵箱連續接收 60 封后就不在收件了)。