因為@vimac的答案沒有解決最近一小時問題,以下僅提供個思路,細節還可以完善//存儲失敗次數時間戳$key="user:{$user_id}:login_failed";$login_failed=$mem->get($key)orarray();$allow_times=12;if(!checkAllowTimes($login_failed,$allow_times)){thrownewException("allowtimesmax",1);}if(!passValid($user_id,$password)){array_unshift($login_failed,time());//最多存12條記錄if(count($login_failed)>$allow_times){$login_failed=array_slice($login_failed,0,$allow_times);}$mem->set($key,$login_failed,3600);}else{//登錄成功刪除失敗記錄,取決于是連續失敗還是累計失敗?$mem->delete($key);//...}functionpassValid($user_id,$password){//...//偽代碼returntrueorfalse;}functioncheckAllowTimes($login_failed,$allow_times){$last_hour=strtotime('1hoursago');for($i=0;$i//如果已經登錄失敗12次if($i>=$allow_times-1){returnfalse;}//1小時前的登錄記錄不檢索if($login_failed[$i]<=$last_hour){returntrue;}}returntrue;}