我有一個功能,通過捲曲發送HTTP請求到www.server.comPHP防止同時執行功能(通過節流PHP限制)
我的任務是確保www.server.com獲得不超過每2秒一次請求。
可能的解決方案:
創建一個功能checktime()
,將當前的通話時間存儲在數據庫中,並在每個下次調用與數據庫檢查並進行系統停頓2秒:
$oldTime = $this->getTimeFromDatabase();
if ($oldTime < (time() - 2)) { // if its been 2 seconds
$this->setNewTimeInDatabase();
return true;
} else {
sleep(2);
return false;
}
問題/問題:
可以說,最後一次請求www.server.com是1361951000.然後10個其他用戶嘗試請求1361951001(1秒鐘後)。 checktime()
函數將被調用。
由於它只有1秒,函數將返回false。所有10個用戶將等待2秒鐘。這是否意味着在1361951003上有10個請求會同時發送?是否有可能在數據庫中不會更改最後一次請求的時間,因爲在checktime()
中錯過了$ this-> setNewTimeInDatabase()的調用?
謝謝!
UPDATE:
我剛纔被告知,使用循環可能解決這個問題:
for($i=0;$i<300;$i++)
{
$oldTime = $this->getTimeFromDatabase();
if ($oldTime < (time() - 2)) { // if its been 2 seconds
$this->setNewTimeInDatabase();
return true;
} else {
sleep(2);
return false;
}
}
但我實在不明白它的邏輯。
對'www.server。'進行檢查會更好。com'? – Zaffy 2013-02-27 20:11:00
@Zaffy我無法訪問'www.server.com' – rinchik 2013-02-27 20:11:39
另一種方法是創建一個靜態變量,它像一個que一樣工作,然後在2秒鐘後,來自que的下一個項目被髮送到服務器。 COM。這必須是一個靜態變量,因此它可以在你的類的所有實例中共享。 – Mike 2013-02-27 20:12:35