[英]Best way to switch development databases in PHP?
目前,我正在為數據庫驅動的網站進行大量更新。
因此,webroot中有一個名為db.php的文件,該文件包含在每個頁面中。 它具有與SQL數據庫的連接詳細信息。 這默認為實時數據庫。
我們還有一個名為db.local.php的文件。 現在,如果此文件存在,則該文件中的連接詳細信息將覆蓋默認值。 因此,此文件不受每個文件設置的唯一控制,因此不受源代碼控制。
我們通過以下方式檢查文件是否存在:
if(file_exists(getcwd().'/db.local.php')) {
require_once('db.local.php');
} else {
//default database details
}
問題是我們使用多個文件夾中的文件,而不僅僅是webroot(例如,從webroot / admin調用的腳本的cwd將是webroot / admin,而不僅僅是webroot)。 因此,如果從另一個文件夾中的腳本調用db.php,則當前的工作目錄將不是webroot,因此我們不會看到db.local.php。 這很不好,因為那時我們使用的數據庫不正確。
有辦法解決嗎? (就像一種檢查從中提取文件目錄的方法,而不是從中執行腳本的位置)。 還是有比解決問題更好的方法?
我這樣做:
switch (gethostname()) {
case 'dev-local':
define('SITE_URL', ....);
define('TRIM_REQUEST_URI', '');
require CONFIG . '/VM/database.php';
break;
......
}
每個服務器都有一個不同的主機名。
如果您從腳本知道它的相對路徑,則可以包含db.local.php。 無論運行腳本時當前的工作目錄如何,此命令都將起作用。 例如,假設您有
/foo/bar/www/db.php
/foo/bar/www/db.local.php
/foo/bar/www/index.php
/foo/bar/scripts/cleanup.php
在cleanup.php內部,您可以像這樣檢查和包含db.local.php:
$APPROOT = __DIR__ . DIRECTORY_SEPARATOR . '..';
$DBLOCAL = $APPROOT . DIRECTORY_SEPARATOR . 'www' . DIRECTORY_SEPARATOR . 'db.local.php';
if(file_exists($DBLOCAL)) {
require_once($DBLOCAL);
}
如果您有很多執行此操作的腳本,則可能需要創建一個初始化文件來設置這些變量並將其包含在每個腳本中(使用相同的__DIR__
方法)。
您可以使用set_include_path
函數指定查找文件的絕對路徑。
http://php.net/manual/zh/function.set-include-path.php
<?php
ini_set('include_path', '/usr/lib/pear');
/*
// On Windows:
ini_set('include_path', 'c:\sites\config');
*/
?>
編輯:然后可以只使用require 'db.php';
並且PHP解析器會知道在您使用ini_set命令指定的目錄中查找。
您也可以將路徑添加到php.ini
文件中...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.