php能不能做到,只給某個使用者延遲回應,其它使用者不受影響?

WBOY
發布: 2016-08-04 09:19:48
原創
974 人瀏覽過

因為最近專案懷疑被惡意刷,打算如果懷疑誰在刷,就延遲他的回應。但是要做到不影響其它人的訪問速度。據我所了解,php會給每次的請求開一個線程,例如同時有1000個訪問,導致接口反應慢了,我給其中的999個用了這個延遲響應的方法,是不是剩下那1個請求會快?還是一樣的速度?

目前我想到的只有用sleep這個方法,不知道靠不靠譜...


識別用戶的方法我已經有了,想知道的是延遲這個用戶的請求的方法


回答有朋友提到返回http錯誤碼,這是可以,但是我限制判斷一個用戶的方式,主要是ip和他的識別碼,這兩個都是可以隨時換的,萬一他換個ip,就知道只對他的ip做了限制了,之後他只要用動態ip來刷,隨時改變他的識別碼,就能繼續刷我的接口,而延遲返回會被認為是伺服器被他拖垮了,他滿足了就好

回覆內容:

因為最近專案懷疑被惡意刷,打算如果懷疑誰在刷,就延遲他的回應。但是要做到不影響其它人的訪問速度。據我所了解,php會給每次的請求開一個線程,例如同時有1000個訪問,導致接口反應慢了,我給其中的999個用了這個延遲響應的方法,是不是剩下那1個請求會快?還是一樣的速度?

目前我想到的只有用sleep這個方法,不知道靠不靠譜...


識別用戶的方法我已經有了,想知道的是延遲這個用戶的請求的方法


回答有朋友提到返回http錯誤碼,這是可以,但是我限制判斷一個用戶的方式,主要是ip和他的識別碼,這兩個都是可以隨時換的,萬一他換個ip,就知道只對他的ip做了限制了,之後他只要用動態ip來刷,隨時改變他的識別碼,就能繼續刷我的接口,而延遲返回會被認為是伺服器被他拖垮了,他滿足了就好

發送HTTP 104 狀態碼(傳說中的「連線被重置」)。

<code>$Code = 104;
$Text = 'connection reset by peer';
http_response_code($Code);
$Protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1');
header($Protocol . ' ' . $Code . ' ' . $Text);</code>
登入後複製

當然,可以由Nginx來做:發送444(服務端超時回應)或499(客戶端等不及了主動關閉連線):判斷IP然後return 444;

sleep的方法不可靠,sleep會阻塞進程,sleep後面是無法給其他請求提供服務的。你php的進程就那麼多,有點阻塞操作都可能影響吞吐量,怎麼會sleep呢。
延遲返回的方案還有個問題,既然是惡意刷,他一定有辦法可以同時發多個請求,那麼延遲返回並不能根本上減少他的請求次數,反而造成請求在伺服器積壓。如果用你們自己的客戶端或網頁​​,很難做到『惡意』。
延遲回傳也有辦法做,非同步回傳請求,反正不要阻塞進程。
綜上還是樓上給他4xx的方法好一點。

就問知道ip嗎?

限制訪問頻率

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板