2017-03-16 90 views
1

我有一個小訂單服務應用程序,通過ajax將訂單提交給PHP腳本。 當PHP腳本接收到它的命令後,它將它放入數據庫中,發送一個'OK'消息返回給客戶端,然後向客戶發送確認電子郵件,向我發送確認郵件。 問題是,客戶端沒有看到「確定」(它更新瀏覽器顯示)約15秒。如果我註釋掉電子郵件發送,請不要拖延。PHP郵件()函數中的延遲

... write to database 
echo "OK"; 
mail($semail,'Msg Subject',$message, $header, $bounceto); 
mail($semail2,'Msg Subject',$mesage, $header, $bounceto); 

消息只是幾行。

問題:

  • 調用mail()函數時爲什麼會有延遲?
  • 如何在不等待PHP腳本完成的情況下發送'OK'消息?我正在猜測某種衝動。

回答

2

這是因爲http://php.net/manual/en/function.mail.php返回成功或失敗的布爾值,並且您的郵件服務器需要時間處理電子郵件請求。

您可以實現某種MYSQL隊列的電子郵件,你會把電子郵件的發送,並與後臺任務(例如使用CRON勞克YourMailQueueProcessingScripts.php,將檢查是否有任何電子郵件發送和執行發送檢查操作 - 請記住,您最多可以每分鐘運行一次CRON,並且我不知道發送電子郵件的延遲是否可以延遲1分鐘)

+0

感謝您的信息和建議。一分鐘的延遲可能是可以接受的。如果我可以將緩衝區刷新到客戶端,然後讓PHP突然離開,那可能會更好? –

+0

它應該與http://php.net/manual/en/function.fastcgi-finish-request.php一起工作,但它需要https://php-fpm.org/ – Mark

+0

...並且有http:// php.net/register_shutdown_function你可以把郵件功能。儘管如此,我仍然認爲他們不適合解決方案。電子郵件從來不是即時的,所以我仍然選擇排隊。 – Mark