2013-06-28 34 views
1

我想存儲一些計數器,並希望根據需要增加。 此計數器與任何客戶端無關,所以我不能使用會話或cookie。 我試過$ GLOBALS但是,它不是我想要的。如何在全球範圍內存儲值?

我想要的東西就像說,我有3個PHP文件,每個會做一些計數器manuplation。

的init.php

$_GLOBAL_VARIABLE['cntr1'] = 0; 

file1.php

$_GLOBAL_VARIABLE['cntr1'] = $_GLOBAL_VARIABLE['cntr1'] + 7; 

file2.php

$_GLOBAL_VARIABLE['cntr1'] = $_GLOBAL_VARIABLE['cntr1'] + ($_GLOBAL_VARIABLE['cntr1'] * 0.90); 

個file3.php

echo $_GLOBAL_VARIABLE['cntr1']; 

所有三個文件(除的init.php)會隨機調用時沒有螞蟻關係,init將調用一次。

我不想嘗試數據庫事務coz計數器manuplation是非常頻繁的,和文件I/O是一樣的。我正在尋找一些方法將數據存儲在服務器上,直到它啓動並運行,有點像全局類和c#中的變量。

+0

您應該嘗試使用會話或cookies –

+0

它與客戶端不相關,因此它沒有意義使用Cookie或會話,這是每個用戶的差異,我希望用戶中心化計數器。 –

+0

Php不提供對此的支持(可悲)。 您可以爲它使用memcache。 –

回答

1

如果您希望在不使用數據庫,cookie或會話的情況下在服務器上存儲全局可訪問的值,則memcache可能是您的解決方案。它是一個守護進程,它允許您存儲數據並在不同的連接請求中使用它。如果你有頻繁的訪問,你將不得不以某種方式處理你的應用程序中的併發。

+0

會話和cookie不會工作,因爲它們是特定於用戶的,他希望某些應用程序的所有用戶實例都是全局的。 memcache將工作,雖然! – Dave

+0

請注意,memcache將對象序列化,所以它不像.NET/IIS那樣真正存儲在內存中。 –

+1

對於只持有一個計數器變量/對象:)應該仍然沒問題,現在這個問題已經提醒我PHP可以有多糟糕 – Dave

0

我認爲這會工作

global $cntr1; 

如果沒有,那麼你可以做一個.inc.php,包括該文件的所有頁面。 這將解決您的問題。

+1

不,它不會特定於應用程序的用戶實例 – Dave

+0

此答案不會滿足OP的要求。 – nickb

0

確定這不是你想要的,但我已經使用fileread/filewrite將我的全局變量存儲在驅動器上的一個文件中,它可以讀取,寫入更新後的值等。將多個全局變量設置爲int,我修改了我的全局代碼以作爲迭代器工作,按照您傳遞的值進行計數或倒計時。

它的一個簡單快速的I類做處理請求:

<?php 
    class my_global{ 

    protected $name; 
    protected $value; 

    static protected $path = './globals/'; 

    public function __construct() 
    { 
     if(!is_dir(self::$path)) 
     mkdir(self::$path); 

    } 

    public function change($name, $value) 
    {   
     $current = $this->get($name); 
     $this->set($name,$current+$value);  
     return $current+$value; 
    }  
    protected function set($name, $value) 
    { 
     $this->name = $name;  
     $this->value = $value;  
     $this->write(); 
    } 
    protected function get($name)  
    { 

     if(file_exists(self::$path.$name)) 
     { 
     $myFile = self::$path.$name; 
     $fh = fopen($myFile, 'r'); 
     $value = fread($fh, filesize($myFile)); 
     fclose($fh); 
     } 
     else 
     $value = 0; 

     $this->name = $name; 
     $this->value = $value; 

     return $value; 

    } 
    protected function write(){  

     $myFile = self::$path.$this->name; 
     $fh = fopen($myFile, 'w') or die("can't open file"); 
     fwrite($fh, $this->value);  
     fclose($fh); 

    } 

    } 
    $my_global = new my_global(); 
?> 

然後,您可以只調用$ my_global->變化()方法來增加或減少櫃檯

<?php  
    echo $my_global->change('new_global',5).'<br>'; 
    echo $my_global->change('anotherglobal',-2).'<br>'; 
    echo $my_global->change('forme',7).'<br>'; 
?> 

這比任何東西都更值得思考,但可以根據需要調整以適應工作。