用php CI架構(這個無所謂,主要是想問一下思路)寫的一個檢測圖書館書籍借閱時間,自動發送郵件的功能。
流程
1、查詢資料庫
2、取得使用者帳號和密碼,類比登陸
3、抓取圖書資訊,取得使用者所有圖書到期時間,判斷如果時間小於兩天,發送郵件。
4、重複 2、3步驟,直到遍曆完所有使用者。
當使用者人數達到3萬時,程式會不會不崩掉,應該怎麼最佳化。想問一下,最佳化的思路。
public function email() { $data = $this->lib_model->M_getUserAndEmail();//取得使用者賬戶 foreach ($data as $keys){ $bookData = $this->imitateLogin($keys['sdutnum'],$keys['lib_pwd']);//類比登陸 for($i=1;$i<=$bookData['bookNum'];$i++) //遍曆使用者所有圖書 { $returnTime = substr($bookData['bookArray']['0'][$i*8+4],65,-13);//擷取還書時間 $day = floor((strtotime($returnTime) - strtotime(date('Y-m-d')))/86400); //計算圖書距離歸還的時間 $bookName = substr($bookData['bookArray']['0'][$i*8+1],111,-10); $title = "山東理工圖書到期提醒"; $content = $keys['sdutnum'].",您的".$bookName."將於".$returnTime."到期";/*add link about address in here.*/ if($day<=2){ $this->sendEmail($keys['email'],$title,$content); //發送郵件 echo "郵件發送完成"; } } } }
回複內容:
用php CI架構(這個無所謂,主要是想問一下思路)寫的一個檢測圖書館書籍借閱時間,自動發送郵件的功能。
流程
1、查詢資料庫
2、取得使用者帳號和密碼,類比登陸
3、抓取圖書資訊,取得使用者所有圖書到期時間,判斷如果時間小於兩天,發送郵件。
4、重複 2、3步驟,直到遍曆完所有使用者。
當使用者人數達到3萬時,程式會不會不崩掉,應該怎麼最佳化。想問一下,最佳化的思路。
public function email() { $data = $this->lib_model->M_getUserAndEmail();//取得使用者賬戶 foreach ($data as $keys){ $bookData = $this->imitateLogin($keys['sdutnum'],$keys['lib_pwd']);//類比登陸 for($i=1;$i<=$bookData['bookNum'];$i++) //遍曆使用者所有圖書 { $returnTime = substr($bookData['bookArray']['0'][$i*8+4],65,-13);//擷取還書時間 $day = floor((strtotime($returnTime) - strtotime(date('Y-m-d')))/86400); //計算圖書距離歸還的時間 $bookName = substr($bookData['bookArray']['0'][$i*8+1],111,-10); $title = "山東理工圖書到期提醒"; $content = $keys['sdutnum'].",您的".$bookName."將於".$returnTime."到期";/*add link about address in here.*/ if($day<=2){ $this->sendEmail($keys['email'],$title,$content); //發送郵件 echo "郵件發送完成"; } } } }
不管你其他的業務,假設你現在有了使用者資訊,和其所借書籍歸還時間
說下這塊的最佳化.
先說你現在業務的缺點,你上面說遍曆所有的資料,這是很不合適的資料一多,速度慢不說,而且效率很低,時間複雜度都是 O(n).
如果是我做,我會有兩個指令碼
一個指令碼每3個小時搜集一次使用者的借書資訊,把使用者郵箱,歸還日期插入到 redis 的有序集合中, score 用日期
一個指令碼每天淩晨跑一次,從 redis 有序集合中擷取兩天內要還書的使用者資料,條件就是
score < time()+兩天秒數
不會,使用者量3W,實際上在兩天內需要還書的並不會是3W,即使飽和來說3W來說,這個資料量也不大
你說的查詢資料庫擷取使用者密碼,我不知道是圖書館方面找你做還是你自己做,如果是圖書館項目,你都能查資料庫了,還要什麼類比登入。如果是自己做,首先你要想一想前兩步能不能搞定。?
有資料庫許可權的話,完全沒必要類比登入
最佳化建議:
1、使用者類比登入:可以緩衝COOKIE?
2、掃描最佳化:可以根據使用者緩衝圖書資訊嗎?加快掃描速度?
3、郵件發送:可以使用非同步方式嗎?