應用案例:
某SNS社區要求用戶給自己好友(好友數量上百個)發送郵件,每封郵件內容不一,發送后提示發送完畢!
常用PHP寫法
sendmail.php
<?php
$count=count($emailarr);//$emailarr數組為好友的郵件地址
for($i=0;$i<$count;$i++)
{
sendmail(.....);//發送郵件
}
echo ''發送完畢';
假設該次發送100封郵件。本次操作會出現什么結果呢?
用戶體驗:用戶等待->發送數十封郵件出去->系統超時返回錯誤信息
本次操作由於需要發送大量的郵件,導致php執行時間過長,用戶煩躁的等待。當apache或者nginx等待超過允許執行時間,返回超時錯誤。這個時候用戶不明確本次操作到底成功與否,到底發出了幾封郵件。
我們可以看出該代碼用戶體驗極差,並且不能夠順利完成任務。
那應該怎么操作呢?
這里提到一個概念,異步執行
用戶體驗:用戶等待->發送完畢
朋友們就會問,怎么缺少發信環節?
OK,發信環節就在用戶提交請求的時候,把發信任務轉給了一個單獨處理發信的php程序處理了,當用戶看見“發送完畢”的時候其實信還沒發送完,這個時候,發信程序正在后台努力的工作着,一封一封的向外發送
sendmail.php
<?php
$domain="www.***.com";
$url="/system_mail.php";
$par="email=".implode(',',$emailarr)."&........";
$header = "POST $url HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($par) . "\r\n\r\n";
$fp = @fsockopen ($domain, 80, $errno, $errstr, 30);
fputs ($fp, $header . $par);
fclose($fp);
echo ''發送完畢';
system_mail.php
<?php
//保證php執行不超時
set_time_limit (0);
//設置當客戶機與服務器斷開連接后是否終止腳本的執行, 這里設置為true表示繼續在后台執行腳本
ignore_user_abort(true);
//獲取email地址,發信,此處為發信代碼
好了,改成異步方式后,用戶提交信息,可以立即得到結果“發送完畢”。信呢,會在后台一封一封的發送,直到發送完畢