2011-09-07 30 views
0

我讀過來,我知道這可能是不可能完成的,因爲我希望這將是,但我希望有一種方法,所以這裏去..PHP自定義超全局數組的問題

我的ID的用戶和我有每個計數。 我希望能夠將這些值存儲在機器內存中,並且在一段時間內只更新一次數據庫,但絕對不是一直。 這個頁面當然是從很多用戶訪問的,我希望這個數組保持與每個用戶的相關性,並根據需要進行更新。 (這是我不想使用數據庫的另一個原因,更新需要時間與索引列,對吧?)

一個數組,例如: $ my_superglobal_arr =('1'=> 304,'2'=> 763, '6'=> 12,'13' => 96); 本來是完美的。

有什麼建議嗎?

謝謝!

+0

全局變量是邪惡的 – zerkms

+0

你是在談論在單個請求期間還是在多個請求期間更新數據庫? 嘗試查找Memcached或Redis,看看它是否符合法案。 – whichdan

+1

@zerkms閱讀郵件正文,而不是標題:P –

回答

4

更新需要時間索引列,對嗎?

沒錯。但是,這取決於。 我強烈建議你先去數據庫,得到實踐經驗與更新和東西,瞭解特定數量的用戶,你可以稱之爲「多」。只有這樣才能決定,如果你真的需要你不同尋常的設置,是否真的有必要或只是虛構的幻想。

讀你的其他問題我只能說,首先學習SQL是必須的。

+0

我完全同意!雖然,我碰到了一個有趣的結合SESSIONs的答案,http://stackoverflow.com/questions/7105866/i-want-to-define-a-variable-with-superglobal-scope-in​​-php。使用具有主機自己的緩存文件abilites的文件看起來像是一個下降解決方案,不是嗎? – Ted

+0

它看起來令人噁心。 –

1

這不是PHP本地提供的東西。最好的選擇是將數據存儲在基於內存的鍵/值存儲中。 PHP本身支持大多數主機提供的memcached。您還可以看看MongoDBRedis

+0

感謝Memcache,MongoDB和Redis!我正在尋找一個PHP固有的解決方案。再次感謝 – Ted

+0

這就是問題所在。沒有一個PHP解決方案不涉及非本地擴展或其他服務。每個PHP請求都在它自己的空間內執行。從一個請求到另一個請求都會丟失。保存此狀態的唯一方法是將其存儲在文件,數據庫中,或將其發送到此作業的另一個服務(memcached,其他數據庫)。既然你想要它在內存中,使用文件或PHP的常規會話處理(這是基於文件的 - 除非你改變了會話處理)不會工作。我同意其他意見,你應該評估爲什麼它不首先使用SQL。 – six8

2

您需要夫婦ArrayAccessAPC緩存能力,採用Singleton模式。

class UserCounter implements ArrayAccess { 
    public static function getInstance() 
    { 
     static $instance; 
     if (!$instance) { 
      $instance = new self; 
     } 
     return $instance; 
    } 

    public function offsetSet($offset, $value) 
    { 
     apc_store(__CLASS__.$offset, $value); 
    } 

    public function offsetExists($offset) 
    { 
     return !!apc_fetch(__CLASS__.$offset); 
    } 

    public function offsetUnset($offset) 
    { 
     apc_delete(__CLASS__.$offset); 
    } 

    public function offsetGet($offset) 
    { 
     return apc_fetch(__CLASS__.$offset); 
    } 

    private function __construct() {} 
    private function __clone() {} 
    private function __wakeup() {} 
} 

用法:

int(1) 

在第二:在第一次請求

$user_counter = UserCounter::getInstance(); 
$user_counter[1] = $user_counter[1] + 1; 
var_dump($user_counter[1]); 

輸出

int(2) 

當你需要這些計數器在數據庫中保存:

$user_counter = UserCounter::getInstance(); 
foreach ($users as $user_id) { 
    store_counter_in_db($user_id, $user_counter[$user_id]); 
} 

注意:there is a bug這可能會阻止您在某些APC版本的單個請求期間遞增單個計數器。據我所知,後續請求中的增量不是問題。

+0

偉大的評論,我從來沒有聽說過APC,它很高興知道它在那裏,雖然它似乎不是PHP的一部分,有些服務器沒有它或不會允許我安裝它。請檢查我對@Col的評論。彈片和鏈接,這看起來像一個下降的方法?感謝代碼! – Ted