2012-04-26 27 views
4

我正在開發一個網站並獲得一個數據庫,用戶可以在其中插入數據(投票)。我想在標題中保留一個計數器,如「x」投票。但很快就會有很多網站上的流量。現在我可以與查詢每30秒運行一次SQL查詢(計數),然後將輸出保存到某個文件中

SELECT COUNT(*) FROM `tblvotes 

,然後在標題顯示號碼,但後來每次用戶更改頁面做到這一點,它會重新進行查詢,所以我想,也許這是更好地查詢每30秒一次(在mysql服務器上負載少得多),但是我需要將它的輸出保存到某個地方(這不應該太難;我可以將它寫入文本文件?)但是我怎麼能讓它我的網站每30秒自動運行一次查詢並將該號碼存入文件中。我沒有SSH服務器,所以我不能crontab它?

如果有什麼你可能不知道的問題隨時問!

回答

3

Crontabs只能以最快的速度每分鐘運行一次。

我認爲有一個更好的解決方案。您應該創建一個存儲統計信息的聚合表。

對於votes_table上的trigger,每當表接收到INSERT語句時,您都可以執行「某事」。

聚合表然後將存儲最準確的信息,然後您可以查詢顯示計數。

+0

但是它仍然會要求用戶在每次切換頁面時都運行一次sql querry?(querry不再是一個計數,而是像「select count from tbltriggercount」)? – Maximc 2012-04-26 14:49:52

+0

@Maximc - 是的,你仍然被迫執行該查詢。此外,這裏還有一個更大的問題 - 要麼是您的聚合表會報告不正確的結果,要麼僅僅更新表本身就會成爲性能瓶頸(這些行爲源於與事務相關的問題)。無論如何,你真正想要的是某種內存中的解決方案,而不是聚合表(具有適當的指示,簡單的'COUNT()'是微不足道的)。 – 2012-04-26 15:39:10

+0

是的,你必須每次都要執行查詢。但是,如果沒有像count()或sum()這樣的函數,它會容易得多。例如。 'SELECT value FROM aggTable WHERE param ='counter''但它確實仍然是一個查詢。 – stUrb 2012-04-26 15:39:28

5

最簡單的方法:將結果寫入本地文本文件,檢查每個請求上文本文件的文件時間小於now()+ 30秒,如果是,則更新文件。要更新,您應該鎖定文件。當文件正在更新時,滿足條件now()+ 30的其他用戶應只讀取當前存在的文件以避免競爭條件。 希望有幫助, Stefan

+0

我怎樣才能看到或文件被鎖定,如果在網站上同時有200個用戶,你確定它不會給出問題嗎? – Maximc 2012-04-26 16:15:51

0

好的,所以你的問題的第一部分基本上是關於緩存總票數的結果包括在頁面的標題。它是一個非常好的主意 - 這裏是一個想法如何實現它...

如果您無法啓用crontab(即使沒有SSH訪問,您可能可以使用您的主機控制面板進行設置),您可能能夠脫離使用外部第三方cronjob服務。 (Google has many results for this)...

每當您的cronjob運行時,您可以創建/更新只包含一些PHP數組文件 -

$fileOutput = "<"."?php\n\n"; 
$fileOutput .= '$'.$arrayName.'='; 
$fileOutput .= var_export($yourData,true); 
$fileOutput .= ";\n\n?".">"; 
$handle = fopen(_path_to_cache_file,'w+'); 
fwrite($handle,$fileOutput); 
fclose($handle); 

這會給你一個PHP文件,你可以簡單地include()到您的標題標記,然後您將有權訪問名稱爲$arrayName$yourData變量。

1

如果可以的話,您可能需要考慮使用memcached。它允許您爲添加到其中的任何數據設置到期時間。

當您第一次執行查詢時,您將編寫與結果關聯的查詢文本的md5。在後續查詢中,查找memcached中的數據。如果它已過期,則可以重新執行sql查詢,然後將其重寫爲memcached。

2

如果您的服務器允許,更好的解決方案將使用一些緩存機制(例如APC)而不是文件。

+0

APC讓你增加一個整數:http://www.php.net/manual/en/function.apc-inc.php – gcochard 2012-04-26 14:55:02

相關問題