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