我有一個用標準PHP(無框架或CMS)編寫的網站,我有一小部分可配置的信息可以存儲,而且我不想或不能存儲它們一個數據庫。如何在不使用數據庫的情況下存儲少量屬性?
有:如數據庫用戶名和密碼
- 全局屬性。
- 內容像聯繫電話號碼和地址。
我知道我可以「硬編碼」這樣的東西,但我想把它們放到一個不嚴格地說是「代碼」的文件中。
有什麼選擇存儲和哪些是適當的?
我有一個用標準PHP(無框架或CMS)編寫的網站,我有一小部分可配置的信息可以存儲,而且我不想或不能存儲它們一個數據庫。如何在不使用數據庫的情況下存儲少量屬性?
有:如數據庫用戶名和密碼
我知道我可以「硬編碼」這樣的東西,但我想把它們放到一個不嚴格地說是「代碼」的文件中。
有什麼選擇存儲和哪些是適當的?
在漂亮的標準PHP中有相當多的選項可供選擇,主要取決於存儲的信息類型以及將要編輯的信息。
「包含」是設置變量
可以使用include
或require
關鍵字包括建立了一系列然後可以將該文件外引用變量文件的另一個PHP文件。
E.g.
database_configuration.php
<?
$dbConfig['host'] = 'myhost';
$dbConfig['username'] = 'myuser';
$dbConfig['password'] = 'mypassword';
$dbConfig['database'] = 'mydatabase';
用法:
<?
include('database_configuration.php');
$connection = new mysqli($dbConfig['host'] , $dbConfig['username']
, $dbConfig['password'], $dbConfig['database']);
這是很「老同學」,是如何很多人會已接近這樣那樣的問題相當長的一段時間。
一個好處是,使用代碼設置配置 - 您可以創建任何你想要的方式,以及任何數量的配置變量/數組/對象;它非常靈活。
但是,它確實鼓勵將變量放在本質上是全局範圍內,這對於未來的可維護性來說不是一個好主意。
此外,由於這是代碼,因此如果預計非編碼器在任何時候都會更改配置,則不合適。它有效,但不是很好。
在運行時更改配置也很困難,然後再次寫出文件。與其他一些選項相比,這基本上是隻讀的。
然而,這是如此普遍,它實際上是在PHP文檔中給出的函數include
第一個例子:http://php.net/manual/en/function.include.php
「包括」返回的配置
這項技術的另一個PHP文件幾乎與上面相同,但它解決了引入全局範圍的問題。
不是配置一系列變量,而是設置返回到包含腳本的局部變量。
database_configuration.php
<?
return array('host' => 'myhost'
, 'username' => 'myuser'
, 'password' => 'mypassword'
, 'database' => 'mydatabase');
用法:
<?
$dbConfig = include('database_configuration.php');
$connection = new mysqli($dbConfig['host'] , $dbConfig['username']
, $dbConfig['password'], $dbConfig['database']);
幾乎相同的考慮第一個例子中需要加以考慮。
它是PHP,所以它非常靈活,但交給非編碼器也是非常危險的。
你無法繞過它 - 你可能已經將配置移動到另一個文件中,但嚴格來說它仍然是'硬編碼'。
這也包括爲include
文檔中,如例5:http://php.net/manual/en/function.include.php
注意,以上的解決方案還可以使用require
:http://php.net/manual/en/function.require.php
這通常是可取的,因爲你會得到一個如果無法找到文件,則編譯錯誤。
使用一個ini
文件
PHP具有內置的處理ini
文件的功能。最有用的可能是parse_ini_file
:http://php.net/manual/en/function.parse-ini-file.php
這允許您以標準格式創建ini文件並使用它來填充數組。
E.g.
database_configuration.ini
[database]
host=myhost
username=myusername
password=mypassword
database=mydatabase
用法:
<?
$dbConfig = parse_ini_file('database_configuration.ini');
$connection = new mysqli($dbConfig['host'] , $dbConfig['username']
, $dbConfig['password'], $dbConfig['database']);
或者,如果你想利用這些部分的文件中:
<?
$dbConfig = parse_ini_file('database_configuration.ini', true);
$connection = new mysqli($dbConfig['database']['host'] , $dbConfig['database']['username']
, $dbConfig['database']['password'], $dbConfig['database']['database']);
這樣做的好處閱讀起來更簡單,因此保持。這不是PHP代碼,因此非代碼管理更容易。您仍然需要有人訪問Web服務器上的文件系統,但至少他們不能編寫任意PHP。
缺點是它只能真正處理原始類型。您可以配置數組,但不能創建對象(比如自己設置數據庫連接)。
最後,像上面列出的其他例子一樣,它基本上是單向的。您無法以編程方式更改內容並存儲結果,而無需以ini
文件格式輸出要輸出的內容。
所有說,雖然做了,它的配置,因此不是「硬編碼」/
使用存儲在文件中的序列化格式
有,你可以用它來生成其他格式更復雜的對象,並且可以在運行時更容易地生成。
一個例子是簡單對serialize
/unserialize
:
例如:http://php.net/manual/en/function.serialize.php
你會通過配置一個變量,然後輸出一個文件產生一輸出
<?
$configuration = array('host' => 'myhost'
, 'username' => 'myuser'
, 'password' => 'mypassword'
, 'database' => 'mydatabase');
file_put_contents('database_configuration.txt', serialize($configuration));
用法:
$dbConfig = unserialize(file_get_contents('database_configuration.txt'));
$connection = new mysqli($dbConfig['host'] , $dbConfig['username']
, $dbConfig['password'], $dbConfig['database']);
結果是一個文件,該文件幾乎是不可讀給最終用戶,但它可以很容易被重新產生。例如,這將使您可以輕鬆創建管理員屏幕,從而允許在不訪問文件系統的情況下設置此類配置。
PHP支持多種不同的格式,比其他格式更具人性化。
Conclusio n
有很多不同的選項,選擇取決於存儲的數據/配置的類型,誰可能會更改配置以及發生的頻率。
我的建議是,無論選擇哪個選項,您都會將其隱藏在課程後面,以便您可以根據需求更改來更改機制。
線沿線的東西:
$sUsername = ConfigurationManager::getConfig('database', 'username');
如果你有內容很多,你要存儲我強烈建議你看看一個標準的CMS框架(Drupal的是,Joomla等) ,或者至少考慮一個數據庫...
我應該參考這個問題和答案(特別是傑克的),讓我想寫一個(希望)規範問題。 http://stackoverflow.com/questions/27249766/storing-page-properties-without-database/27249913#27249913 – 2014-12-03 10:09:05
我是一個儘可能簡單的朋友,在這種情況下,你不想改變這些值,而不是一個簡單的大型數組文件完全做好這份工作。這確實不是很專業,但對於快速項目來說:爲什麼不呢? – Sliq 2014-12-03 10:43:56