1. 程式人生 > >php yaf框架擴充套件實踐一——配置篇

php yaf框架擴充套件實踐一——配置篇

配置檔案基本可以說是每個專案都會有,在配置檔案中我們通常會配置資料庫訪問地址、redis連線、url地址等等。早年開發的時候經常碰到這樣麻煩的問題:就是本地開發環境的配置和測試環境、生產環境的配置都不全一樣,像資料庫連線配置、url地址配置等,每次更新專案到測試環境、生產環境的時候都需要修改配置,真的是非常麻煩。

幸好yaf對於配置檔案的解析提供了節(section)的支援,並且還支援節之間的繼承功能,將節的設定和yaf執行環境(yaf.environ)結合起來就可以達到很好的配置效果,且看如何實現。

配置執行環境

在配置php支援yaf的時候,可以設定一個引數yaf.environ:把本地開發設定成develop、測試環境配置成test、生產環境配置成product,如:

[yaf]
extension=yaf.so
yaf.use_namespace=1
yaf.environ=develop

通過設定執行環境,在專案中可以通過ini_get(‘yaf.environ’)獲取環境引數,進而取到相應節的配置。

檔案配置

yaf擴充套件配置

yaf擴充套件配置

yaf配置檔案一般都放在專案的conf資料夾下,這裡也不例外。yaf application例項化的時候需要傳遞一個配置檔案路徑,假設我們的配置檔案叫application.ini,先看下application.ini的結構:

1

2

3

4

5

6

7

8

9

10

11

[common]

; 通用配置

 

[product : common]

; 生產環境配置

 

[test : common]

; 測試環境配置

 

[develop : common]

; 開發環境配置

這裡的配置除了節之外,節和節之間還有繼承關係。例如[product : common]就表示product的配置會繼承common的配置。先配置一個數據庫連線看看。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

[common]

; 通用配置

 

; 資料庫配置

resources.database.params.driver = "pdo_mysql"

resources.database.params.hostname = "127.0.0.1"

resources.database.params.port = 3306

resources.database.params.database = "database"

resources.database.params.username = "username"

resources.database.params.password = "password"

resources.database.params.charset = "UTF8"

resources.database.params.driver_options.1002 = "SET NAMES utf8"

 

[product : common]

; 生產環境配置

 

[test : common]

; 測試環境配置

 

[develop : common]

; 開發環境配置

 

resources.database.params.hostname = "127.0.0.1"

resources.database.params.database = "database"

resources.database.params.username = "username"

resources.database.params.password = "password"

yaf在例項化應用的傳遞該配置檔案路徑和執行環境:

1

2

define("APPLICATION_PATH"realpath(dirname(__FILE__) . '/../'));

$app new \Yaf\Application(APPLICATION_PATH . "/conf/application.ini"ini_get('yaf.environ'));

這樣當專案執行環境在develop下的時候,會優先讀取[develop : common]內的配置,如果沒有則會從[common]中獲取。在專案中任何地方都可以通過

1

\Yaf\Application::app()->getConfig();

獲取application.ini中的配置。

事實上該例中可以不用傳遞ini_get(‘yaf.environ’)引數,在例項化的時候yaf會自行讀取php.ini中的yaf.environ引數。但如果是其它的配置檔案,則需要傳遞該引數。

額外的配置

隨著專案越來越龐大,配置也會越來越複雜,如果都放在專案預設的配置檔案application.ini中,可能配置會有好幾百行,這樣就不容易維護了。一般我們會考慮新建配置檔案用來儲存額外的配置。yaf中提供了\Yaf\Config\Ini類來處理這些額外的配置檔案。

1

$config new \Yaf\Config\Ini(APPLICATION_PATH . '/conf/url.ini'ini_get('yaf.environ'));

在實際讀取的時候,最好能設定一個靜態變數儲存讀取到的配置,避免重複申請系統open函式呼叫。如下:

1

2

3

4

static $config = null;

if ($config === null) {

    $config new \Yaf\Config\Ini(APPLICATION_PATH . '/conf/url.ini'ini_get('yaf.environ'));

}

詳細可以參考yaf擴充套件示例Bootstrap中的getUrlIniConfig方法。

配置檔案快取

yaf官方有提到可以通過yaf.cache_config來快取配置檔案提高效能,但筆者在實際測試中發現差別不大,估計是由於配置檔案還不夠大的原因,因為拆分了配置?有興趣的小夥伴可以自行研究測試下,歡迎分享。

小結

通過這樣的配置方式我們很好地解決了配置檔案的管理問題,可以很方便將整個版本庫的程式碼直接推送到測試環境和釋出到生產環境。需要注意的是:如果生產環境的配置有較強的保密性,那就只能在釋出的時候進行配置了。