2012-11-02 50 views
1

讓我把要求,以滿足第PHP:從屬性文件初始化常量

一個PHP網關,以及一組請求處理的,它使用目前我在constants.phpdefine('conts','value');

定義很多常量

我可以在某些外部文件中定義屬性文件中的這個常數像

const1 =val1 
const2 = val2 
const3 = val3 

gateway.properties並在運行時加載到define()。這是否是一次性動作,以便由php創建的線程可以進一步訪問這個常量,而不需要重新加載?

我不知道這是否真的可能,我想要一個專家的建議。

謝謝

回答

1

我會通過將結果對象填入memcached來處理這個問題。

這顯然有一些開銷。您需要權衡是否適合您的情況。對於3個變量,它根本沒有意義。對於300,000,也許會。測試一下,看看。

+0

我已經在爲其他目的使用memcache。這種方式很好,只是想確認我是否可以像CONST_1那樣使用它,而不是$ memcache-> get(CONST_1) – Kris

+0

我還會爲此重用memcache。感謝您的建議 – Kris

0

您可以閱讀每一行,解析出=並在for循環中定義。

+0

我想他正試圖節省不必每次都要重新加載該文件的開銷,他的應用程序啓動。 – Brad

+0

這是一個好點 – jarchuleta

1

在PHP中,最好使用.ini文件,並使用

http://php.net/manual/en/function.parse-ini-file.php 或php.net/manual/en/function.parse-ini-string.php如果您已經閱讀該文件爲一個字符串已經。

您可以使用apc將其緩存在內存中,如果還沒有緩存,然後將其緩存,則可以使用後退來讀取文件。

<?php 
$ini = apc_fetch('configuration'); 
if (!$ini) { 
    $ini = file_get_contents('path/to/ini.ini'); 
    if ($ini) { 
     apc_store('configuration',$ini); 
    } 
} 
$config = parse_ini_string($ini); 
+0

這是一個非常好的建議。謝謝 – Kris

0

做到這一點,最簡單的方法是將您的值存儲在.ini文件,然後閱讀與parse_ini_file()文件。 ini文件看起來像:

var1 = 'blah blah blah' 
var2 = 'more blah' 

PHP很快讀取這些文件。我建議,不要將所有值轉換爲常量,而是將從.ini文件獲得的關聯數組存儲在單個全局變量中。讓工作,同樣的知名度。

如果您確實設置了緩存,則可以使用APC緩存。它可以節省幾毫秒,但除非你談論相當大的一組數值,否則它不會有所作爲。如果你要堅持把它們全部變成常量,你仍然需要爲每個值調用define()。保存單個全局關聯數組的速度仍然快得多。

0

考慮使用全局易於訪問的靜態類。
您只能創建一個只有公共靜態成員的類,而CLASS :: init()調用一個可選的配置文件來替換變量。
如果缺失值,它將保持默認狀態。
所以你可以從任何地方使用CLASS訪問配置:$ STATIC_VAR

初始化函數:

  $vars = parse_ini_file(dirname(__FILE__) .'/'. $filename,true,INI_SCANNER_TYPED); 
      if ($vars) 
      { 
       foreach ($vars as $key => $val) 
       { 
         if (property_exists(get_called_class(),$key)) self::$$key=$val; 
       } 
      }