2014年5月11日 星期日

PHP 微框架對 Appfog 的特別處理

太久沒有玩自己寫的 PHP 微框架, 忘記安裝時是如何處理資料庫設定檔 dbsettings.php, 所以花了一些時間去看原始碼, 原來對 Appfog 是有特別處理的, 亦即, 若是 Appfog 主機, 那麼用 getenv() 讀取伺服器的 "VCAP_SERVICES" 系統變數時, 它會傳回資料, 經 json_decode() 解碼後轉為陣列, 這樣就可以讀取 Appfog 主機傳回的 MySQL 資料庫設定參數. 參考 Appfog 的MySQL 文件 :

# https://docs.appfog.com/services/mysql

如果不是 Appfog 主機, 當然就不會有傳回值, 這時就要從 dbsettings.php 去讀取. 所以對於 Appfog 主機而言, 是不需要 dbsettings.php 檔的; 但其他一般 PHP 主機就需要, 而且最好在上傳程式前, 先用 phpMyAdmin 先設定好資料庫, 取得其存取參數 (host, user, pwd, database), 改好 dbsettings.php 再上傳整個系統檔案比較好, 這樣瀏覽首頁轉到 install.php 時就不需要輸入這些參數了.

<?php
$installed=find_table("sys_settings"); //檢查資料庫是否已安裝
if ($installed === FALSE) { //系統尚未安裝, 先安裝系統
    //先判斷是否為 Appfog 雲端虛擬主機以讀取 MySQL 連線參數
    $services_json=json_decode(getenv("VCAP_SERVICES"),true);
    if (is_array($services_json)) { //appfog 雲端虛擬主機
        $mysql_config=$services_json["mysql-5.1"][0]["credentials"];
        $username=$mysql_config["username"];
        $password=$mysql_config["password"];
        $hostname=$mysql_config["hostname"];
        $port=$mysql_config["port"];
        $db=$mysql_config["name"];
        $address="$hostname:$port";
        } //end of if
    else { //一般 PHP+MySQL 虛擬主機 (從 dbsettings.php 檔讀取)
        $str=read_file("dbsettings.php");
        $username=return_between($str,"'MYSQL_USERNAME','","')","EXCL");
        $password=return_between($str,"'MYSQL_PASSWORD','","')","EXCL");
        $address=return_between($str,"'MYSQL_ADDRESS','","')","EXCL");
        $db=return_between($str,"'DATABASE','","')","EXCL");
        } //end of else
?>

即使是自己寫的東西, 過一段時間就會想不起來當初是如何寫, 為何要這麼寫, 因此在每一行程式碼後面儘可能加註, 這樣才能快速喚醒記憶.


沒有留言 :