2015-11-07 25 views
0

我碰到了一個泡菜。通常我可以通過一些大量的谷歌搜索(到正確的SO線程)找到解決我的問題的方法,但現在還沒有。可以同時從多個腳本更新和檢查的變量

我正在使用一個API,它允許我通過cURL訪問其數據,並且此API每10分鐘有500個請求的請求限制。如果此限制反覆超出,您的API密鑰將被暫停。

我用PHP編寫的應用程序經常通過不同的頁面發出請求 - 有時會同時發生。我需要一個解決方案來確保我始終處於請求限制之下。我需要能夠同時檢查和更新每10分鐘重置一次的變量。 這甚至可以完成?我應該如何處理這個問題?

我並不是要求源代碼達到完美的解決方案,我只是想指出如何解決這個問題,或者如果解決不了問題 - 替代方法是什麼?

預先感謝您。

+0

一個執行curl請求的隊列和中心點,每當你發出請求時都會有一個數據庫的日期,然後count(*)'行數,一個帶有排它鎖的文件。 – Sumurai8

+0

您是多次獲取相同的數據還是總是不同?我使用緩存機制:檢查請求是否存在緩存文件;如果未過期(比10分鐘早),則返回緩存的數據;否則發出請求並將其存儲在一個文件中。 – Kenney

回答

1

聽起來像memcache是你在找什麼。它可以保存諸如PHP對象或基本類型的變量,並給它們以及過期日期。只需谷歌的PHP的memcached擴展和看看這裏:http://php.net/manual/en/class.memcache.php

Furhermore,它可以通過TCP訪問並具有一些故障轉移功能。 AWS提供的服務與調用它的memcache API兼容ElastiCache

+0

我目前正在研究MySQL解決方案,因爲我現在只是一個業餘愛好開發人員,但我仍然對使用'memcache'方法而不是MySQL的好處是什麼? –

+0

當使用數據庫時,您需要處理客戶端到期的東西,顯然只需要存儲10分鐘內的易失性數據就會產生巨大的開銷。內存緩存很快,一旦到期,變量就會「消失」。 –

1

如果頁面由不同的用戶運行,那麼我只能想到的是存儲在表中。

這樣做

$datestring = substr(date("Y-m-d H:i"),0, -1); 

這樣你有分鐘2016年11月7日17:00:00總是相同的字符串 - 2016年11月7日17時09分59秒。

然後在一個表中存儲與此機制:

"INSERT INTO table (datestring, count) VALUES ('$datestring', '1') ON DUPLICATE KEY UPDATE count = count + 1"; 

當然把datestring CHAR(15)作爲一個獨特的密鑰。

你用一個選擇的FROM ...檢查你的計數。比較剛剛創建的日期字符串,並且你沒有得到任何行或計數值的行。

這是一個解決方案,當然有很多。

+0

謝謝你的回答!我已經用這種方法做了一個快速解決方案,目前它似乎工作正常,儘管我只在本地進行了測試。希望我明天有時間在公共服務器上進行一些廣泛的測試。 –

+0

考慮同時添加時間戳,每次使用apikey一行,timestamp以秒爲單位,所以在mysql中有如timevalue> CURRENT_TIMESTAMP - 600是10分鐘前。 – AndreaBogazzi

相關問題