2010-09-28 189 views
2

在ASP.NET中,我可以存儲會話和應用程序狀態。 PHP的情況也是如此嗎?我似乎無法找到有關應用程序狀態的信息。PHP應用程序狀態

如果不是,共享狀態信息的最佳做法是什麼?我需要建立一個有點複雜的數據結構,所有客戶都可以使用。編譯需要一段時間,但編譯後不會編輯。

感謝, 邁克爾

回答

5

PHP沒有任何相當於應用程序狀態。您最好的選擇是在APC或memcache(或Windows服務器上的WinCache)中維護您的數據結構。

+0

我有一個問題關於創建使用會話的應用狀態變量。你能否回顧一下並幫我澄清一下這個問題? http://stackoverflow.com/questions/3760270/could-we-use-session-to-create-a-global-variable-for-all-client – coolkid 2010-09-28 14:41:41

1

雖然PHP沒有內置的應用程序狀態系統,但是如果在構建之後不寫入內容,則可以非常容易地模擬它(如果需要編寫,可以模擬它,但併發問題會使它變得很多很難做到)。

基本上,PHP提供了一個serialize方法來存儲字符串中的對象。然後,您可以在一個工廠類,構建一個簡單的緩存層將對象存儲在文件系統:

class Factory { 
    public static function getFooObject() { 
     $signature = 'foo'; 
     $obj = self::getStoredObject($signature); 
     if (!$obj) { 
      $obj = new Foo(); 
      self::storeObject($signature, $object); 
     } 
     return $obj; 
    } 
    public static function getFooBarObject($arg1) { 
     $signature = 'foobar_'.md5(serialize($arg1)); 
     $obj = self::getStoredObject($signature); 
     if (!$obj) { 
      $obj = new FooBar($arg1); 
      self::storeObject($signature, $object); 
     } 
     return $obj; 
    } 
    protected function getStoredObject($signature) { 
     $path = PATH_TO_CACHE . $signature; 
     if (file_exists($path)) { 
      $data = file_get_contents($path); 
      $obj = @unserialize($data); 
      return $obj; //Would return false on error, so we're ok 
     } 
     return false; 
    } 
    protected function storeObject($signature, $obj) { 
     $path = PATH_TO_CACHE . $signature; 
     file_put_contents($path, serialize($obj)); 
    } 
} 

這一切真的是它。如果你想變得有趣,你可以實現一個元數據系統併爲你的類編寫版本,這樣如果你對底層類進行了修改,它會隱式地刷新緩存的對象並重新初始化它。

2

PHP沒有任何應用程序狀態,但是您可以使用不同的PHP運行時 - Phalanger(http://phalanger.codeplex.com/)。這是PHP到.NET編譯器,並允許您利用大多數.NET功能。其中,您可以定義真正的靜態變量。

class X { 
    [AppStatic] 
    static $x; 
} 
echo X::$x; 

當然,你必須照顧關鍵部分的等