2010-01-26 35 views
1

我對在我的PHP項目我建立做設置最新的想法是,我所有的設置保存在配置PHP文件,PHP文件只會返回一個這樣的數組...在PHP中加載設置的最佳性能?

<?php 
/** 
* @Filename app-config.php 
* @description Array to return to our config class 
*/ 
return array(
    'db_host' => 'localhost', 
    'db_name' => 'socialnetwork', 
    'db_user' => 'root', 
    'db_password' => '', 
    'site_path' => 'C:/webserver/htdocs/project/', 
    'site_url' => 'http://localhost/project/', 
    'image_path' => 'C:/webserver/htdocs/fproject/images/', 
    'image_url' => 'http://localhost/project/images/', 
    'site_name' => 'test site', 
    'admin_id' => 1, 
    'UTC_TIME' => gmdate('U', time()), 
    'ip' => $_SERVER['REMOTE_ADDR'], 
      'testtttt' => array(
        'testtttt' => false 
        ) 
); 
?> 

請注意實際配置數組要大得多,其中有很多項...
然後我會有一個Config.class.php文件,它會加載我的數組文件並使用魔術方法__get($ key)。然後我就可以自動加載我的配置類文件,並訪問任何這樣的網站設置...

$config->ip; 
$config->db_host; 
$config->db_name; 
$config->db_user; 

所以我知道這偉大工程,是非常靈活的,在我的課,我可以把它在數組的PHP文件閱讀就像我現在正在做的那樣,將INI文件讀入數組,將XML文件讀入數組,將JSON文件讀入數組。所以對於未來的項目來說它非常靈活,但我更關心的是我現在正在開發的這個特定項目的性能,它將是一個像facebook/myspace這樣的社交網站,並且在此項目之前我有一個社區網站,並且一旦我大約有10萬用戶的表現變得非常重要。因此,我不是「微觀優化」或「過早優化」。我非常希望在考慮到性能的情況下以最佳方式實現這一目標,但不需要靈活,因爲我只需要在此項目中使用它。

因此,有了這些信息,我總是閱讀有關儘可能消除函數調用的人說,函數調用導致更多開銷。所以我想從更有經驗的人那裏瞭解你對此的看法?我在PHP中使用類和對象是新手,所以調用$ config-> db_user;因爲像這樣在過程中調用函數的代價高昂getOption('db_user'); ?我猜測它和每次我使用__get()方法調用它的設置都是一樣的。

因此,爲了獲得最佳性能,我應該採用不同的方法來解決這個問題嗎?像剛纔裝我的配置陣列爲引導文件和訪問項目時,我需要他們這樣的...

$config['db_host']; 
$config['db_username']; 
$config['db_password']; 
$config['ip']; 

請給我你對這個想法有沒有我做了一堆基準測試的

回答

4

從我見過的測試中,我相信上述Alix Axel的回答在四種方法的相對速度方面是正確的。使用直接方法是最快的,使用任何種類的魔法方法通常都比較慢。

另外,就優化而言。您所描述的系統中的任何單個請求的最大性能影響可能是解析XML/INI/JSON,而不是通過您決定使用哪種語法來訪問它。如果你想解決這個問題,一旦你解析它,將加載的數據存儲在APC中。這將帶來一個警告,您只需要將靜態數據存儲在其中,而不是像UTC日期那樣的動態內容。

+0

+1用於指出文件訪問和解析是這裏真正的瓶頸,並且提示APC – Gordon 2010-01-26 08:20:11

3

首先,不是返回數組的包含文件,而是使用.ini文件,然後使用PHP的parse_ini_file()加載設置。其次,在這種情況下,你不應該擔心函數調用。爲什麼?因爲你可能有100,000個用戶,但如果所有100,000個執行一個腳本並需要一些配置值,那麼你的100,000個函數調用分佈在100,000個腳本中,就性能而言這將是完全不相關的。

函數調用只是一個問題,如果單個腳本執行,例如,執行100,000個。

所以選擇最自然的實現。一個對象或一個數組都可以很好地工作。其實一個對象的優點在於,你可以這樣做:

$db = $config->database->hostname; 

其中$config->database可以隱式加載只是INI文件的數據庫部分,將創建另一個配置對象,它可以返回hostname條目。如果你想這樣分割你的配置文件。

+0

爲什麼你會推薦除了那些FW正在使用它,並且它很容易從PHP代碼中區分出來?將它作爲數組存儲是最快的方法。 – 2010-01-26 03:11:33

+0

@Itay Moav:INI文件應該比PHP數組快,但我並沒有在cletus建議中考慮'__get()'開銷。 – 2010-01-26 03:19:13

+0

我避免使用ini文件的唯一原因是我無法將諸如用戶IP或當前UTC時間戳之類的東西設置爲其中一個值。它看起來像我走的任何路線我基本上採取一個數組,然後將其包裝在一個類似乎它會增加很多開銷也許?我應該添加到我的文章中,一些配置項可能需要在頁面上反覆訪問。例如,如果我需要在一個頁面上訪問10次ip設置,那麼這將是10個函數調用相同的值,那麼對於這種類型的情況,您認爲什麼是最佳解決方案? – JasonDavis 2010-01-26 03:27:39

1

IMO這些是最快的方法(按順序):

  1. $config['db_user']
  2. $config->db_user直接
  3. $config->db_user通過__get()
  4. getOption('db_user')通過__get()

而且,你已經已經問了很多questions about your config system,不是我介意的,但我特別記得你問了a question about whether you should use parse_ini_file() or not

爲什麼你一遍又一遍地重複基本相同的問題?

我認爲你正在做過早的優化到一個全新的水平,你應該擔心100,000名用戶的性能IFF,當你獲得50,000個用戶左右,而不是現在。

+0

(刪除了實際上沒有增加任何值的註釋) – 2010-01-26 05:07:37