需求:
在某系統裡,上傳完一個產品的補丁檔案或發布產品的更新資訊,需要給使用該產品的使用者(使用者數量較多)發送一封電子郵件,發送後提示發送完畢!我們常用的PHP代碼寫法如下:
// ......
//尋找出所有使用該產品的使用者email地址,假設存放在$email數組中
for($i=0;$i sendemail();
}
function sendemail(){
//發送郵件代碼
}
//......
假設該次發送100封郵件。本次操作會出現什麼結果呢?使用者體驗:使用者等待->發送郵件完畢->返回資訊(這期間極有可能,指令碼執行逾時)本次操作由於需要發送大量的郵件,導致php執行時間過長,使用者煩躁的等待。
當apache或者nginx等待超過允許執行時間,將返回逾時錯誤。
這個時候使用者不明確本次操作到底成功與否,到底發出了幾封郵件。由此我們可以看出以上代碼使用者體驗極差,並且不能夠順利完成任務。
那麼如何解決這個使用者體驗較差的問題呢?
這裡提到一個概念,非同步執行
使用者體驗:使用者等待->發送完畢朋友們就會問,怎麼缺少發信環節?
OK,發信環節就在使用者提交請求的時候,把發信任務轉給了一個單獨處理髮信的php程式處理了,當使用者看見“發送完畢”的時候其實信還沒發送完,這個時候,發信程式正在後台努力的工作著,一封一封的向外發送。
$domain="www.scutephp.com";
$url="/sendEmail.php";
$par="email=1@163.com,2@163.com,3@163.com&time=".time();
$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 '發送完畢';