以下は引用内容です
自分の php アプリケーションを他の人や企業が利用できるようにする予定がある場合は、アプリケーションが構成可能であることを確認する必要があります。少なくとも、データベース内の内容が公開されないように、ユーザーが安全な方法でデータベースのログインとパスワードを設定できるようにします。
この記事では、構成設定を保存し、これらの設定を編集するためのいくつかのテクニックを説明します。さらに、この記事では、どの要素を構成可能にする必要があるか、および構成の過剰または過少のジレンマに陥ることを回避する方法についてのガイダンスも提供します。
設定にはINIファイルを使用します
PHP には設定ファイルのサポートが組み込まれています。これは、データベース接続のタイムアウトやセッションの保存方法などの定数が定義される php.ini ファイルなどの初期化ファイル (INI) メカニズムを通じて実現されます。必要に応じて、この php.ini ファイルでアプリケーションの構成をカスタマイズできます。説明のために、次のコード行を php.ini ファイルに追加しました。
myapptempdir=foo
次に、リスト 1 に示すように、この構成項目を読み取るための小さな PHP スクリプトを作成しました。
リスト1.ini1.php
関数get_template_directory()
{
$v = get_cfg_var( “myapptempdir” );
return ( $v == null ) ? “tempdir” : $v;
}
echo( get_template_directory().” ” );
?>
このコードをコマンドラインで実行すると、次の結果が得られます:
% php ini1.php
ふー
%
それはすごいですね。しかし、標準の INI 関数を使用して myapptempdir 構成項目の値を取得できないのはなぜですか? 調べてみたところ、ほとんどの場合、これらの方法ではカスタム構成項目を取得できないことがわかりました。ただし、get_cfg_var 関数を使用してアクセスできます。
このメソッドを簡素化するには、以下に示すように、構成キー名とデフォルト値をパラメータとして受け取る 2 番目の関数で変数へのアクセスをカプセル化します。
リスト2.ini2.php
関数 get_ini_value( $n, $dv )
{
$c = get_cfg_var( $n );
return ( $c == null ) ? $dv : $c;
}
関数get_template_directory()
{
Return get_ini_value( “myapptempdir”, “tempdir” );
}
これは INI ファイルにアクセスする方法の概要です。そのため、別のメカニズムを使用したり、INI ファイルを別の場所に保存したい場合は、わざわざ多くの機能を変更する必要はありません。
アプリケーションの構成に INI ファイルを使用することはお勧めしません。理由は 2 つあります。まず、これにより INI ファイルの読み取りが容易になりますが、INI ファイルを安全に書き込むことはほぼ不可能になります。したがって、これは読み取り専用の構成項目にのみ適しています。次に、php.ini ファイルはサーバー上のすべてのアプリケーションで共有されるため、アプリケーション固有の構成項目をそのファイルに書き込むべきではないと思います。
INI ファイルについて知っておくべきことは何ですか? 最も重要なことは、以下に示すように、構成項目を追加するためにインクルード パスをリセットする方法です。
リスト3.ini3.php
echo(ini_get(”include_path”).” ” );
ini_set("include_path",
)ini_get("include_path").":./mylib" );
echo(ini_get(”include_path”).” ” );
?>
この例では、ローカルの mylib ディレクトリをインクルード パスに追加したので、require ステートメントにパスを追加せずに、そのディレクトリから PHP ファイルを要求できます。
PHPでの設定
設定エントリを INI ファイルに保存する一般的な代替方法は、単純な PHP スクリプトを使用してデータを永続化することです。以下に例を示します。
リスト4.config.php
#一時ディレクトリの場所を指定します
#
$TEMPLATE_DIRECTORY = “tempdir”;
?>
この定数を使ったコードは以下の通りです。
リスト5.php.php
require_once ‘config.php’;
関数get_template_directory()
{
グローバル $TEMPLATE_DIRECTORY;
$TEMPLATE_DIRECTORYを返す;
}
echo( get_template_directory().” ” );
?>
このコードには最初に設定ファイル (config.php) が含まれており、その後これらの定数を直接使用できます。
このテクノロジーを使用すると多くの利点があります。まず、誰かが config.php ファイルを参照しただけでは、ページは空白です。したがって、config.php を同じファイルに配置して、Web アプリケーションのルートとして機能させることができます。次に、どのエディタでも編集でき、一部のエディタには構文の色付けや構文チェック機能も備わっています。
この技術の欠点は、INI ファイルと同様に読み取り専用の技術であることです。このファイルからデータを抽出するのは簡単ですが、この PHP ファイル内のデータを調整するのは難しく、場合によっては不可能です。
次の代替案は、本質的に読み取りと書き込みの両方が可能な構成システムを作成する方法を示しています。
テキストファイル
前の 2 つの例はどちらも読み取り専用の構成エントリーには適していますが、読み取りと書き込みの両方が可能な構成パラメーターについてはどうなるでしょうか? まず、リスト 6 のテキスト構成ファイルを見てください。
リスト6.config.txt
#私のアプリケーションの設定ファイル
タイトル=私のアプリ
TemplateDirectory=tempdir
これは INI ファイルと同じファイル形式ですが、独自のヘルパー ツールを作成しました。これを行うために、以下に示すように独自の Configuration クラスを作成しました。
リスト7.text1.php
クラス構成
{
PRivate $configFile = ‘config.txt’;
private $items = array();
関数 __construct() { $this->parse() }
function __get($id) { return $this->items[ $id ];
関数parse()
{
$fh = fopen( $this->configFile, ‘r’ );
while( $l = fgets( $fh ) )
{
if ( preg_match( ‘/^#/’, $l ) == false )
{
preg_match( ‘/^(.*?)=(.*?)$/’, $l, $found );
$this->items[ $found[1] ] = $found[2];
}
}
fclose( $fh );
}
}
$c = new Configuration();
echo( $c->TemplateDirectory.” ” );
?>
このコードはまずConfigurationオブジェクトを作成します。次にコンストラクターは config.txt を読み取り、解析されたファイルの内容をローカル変数 $items に設定します。
その後、スクリプトはオブジェクト内で直接定義されていない TemplateDirectory を探します。したがって、$id を「TemplateDirectory」に設定してマジック __get メソッドが呼び出され、そのキーの $items 配列の値が返されます。
この __get メソッドは PHP V5 環境に固有であるため、このスクリプトは PHP V5 で実行する必要があります。実際、この記事のすべてのスクリプトは PHP V5 で実行する必要があります。
このスクリプトをコマンドラインで実行すると、次の結果が表示されます:
http://www.knowsky.com/php.asp
% php text1.php
tempdir
%
すべて期待どおりです。オブジェクトは config.txt ファイルを読み取り、TemplateDirectory 構成項目の正しい値を取得します。
しかし、構成値を設定するにはどうすればよいでしょうか? 以下に示すように、このクラスに新しいメソッドといくつかの新しいテスト コードを作成して、この関数を取得します。
リスト8.text2.php
クラス構成
{
…
function __get($id) { return $this->items[ $id ];
function __set($id,$v) { $this->items[ $id ] = $v }
;関数 parse() { … }
}
$c = new Configuration();
echo( $c->TemplateDirectory.” ” );
$c->TemplateDirectory = ‘foobar’;
echo( $c->TemplateDirectory.” ” );
?>
さて、__get 関数の「いとこ」である __set 関数があります。この関数はメンバー変数の値を取得しません。この関数はメンバー変数を設定するときに呼び出されます。下部のテスト コードは値を設定し、新しい値を出力します。
このコードをコマンドラインで実行したときの結果は次のとおりです:
% php text2.php
tempdir
フーバー
%
素晴らしいですね! しかし、変更を修正するには、ファイルを書き込んで読み取る必要があります。以下に示すようにファイルを書き込むための新しい機能。
リスト9.text3.php
クラス構成
{
…
関数save()
{
$nf = “;
$fh = fopen( $this->configFile, ‘r’ );
while( $l = fgets( $fh ) )
{
if ( preg_match( ‘/^#/’, $l ) == false )
{
preg_match( ‘/^(.*?)=(.*?)$/’, $l, $found );
$nf .= $found[1].”=”.$this->items[$found[1]].”;
}
その他
{
$nf .= $l;
}
}
fclose( $fh );
copy( $this->configFile, $this->configFile.’.bak’ );
$fh = fopen( $this->configFile, ‘w’ );
fwrite( $fh, $nf );
fclose( $fh );
}
}
$c = new Configuration();
echo( $c->TemplateDirectory.” ” );
$c->TemplateDirectory = ‘foobar’;
echo( $c->TemplateDirectory.” ” );
$c->save();
?>
新しい保存機能はconfig.txtを巧みに操作します。更新された構成項目でファイルを単に書き換えるのではなく (コメントが削除されます)、ファイルを読み取って $items 配列の内容を柔軟に書き換えました。こうすることで、ファイル内のコメントが保存されます。
コマンドラインでスクリプトを実行し、テキスト構成ファイルの内容を出力すると、次の出力が表示されます。
リスト 10. 関数の出力の保存
% php text3.php
tempdir
フーバー
% cat config.txt
#私のアプリケーションの設定ファイル
タイトル=私のアプリ
TemplateDirectory=foobar
%
元の config.txt ファイルが新しい値で更新されました。
xml設定ファイル
テキスト ファイルは読み取りや編集が簡単ですが、XML ファイルほど普及していません。さらに、マークアップや特殊記号のエスケープなどを理解する XML 用のエディターが多数あります。では、構成ファイルの XML バージョンはどのようなものになるでしょうか。リスト 11 は、XML 形式の構成ファイルを示しています。
リスト11.config.xml
リスト 12 は、XML を使用して構成設定をロードする Configuration クラスの更新バージョンを示しています。
リスト12.xml1.php
クラス構成
{
private $configFile = ‘config.xml’;
private $items = array();
関数 __construct() { $this->parse() }
;function __get($id) { return $this->items[ $id ];
関数parse()
{
$doc = new DOMDocument();
$doc->load( $this->configFile );
$cn = $doc->getElementsByTagName( “config” );
$nodes = $cn->item(0)->getElementsByTagName( “*” );
foreach( $nodes as $node )
$this->items[ $node->nodeName ] = $node->nodeValue;
}
}
$c = new Configuration();
echo( $c->TemplateDirectory.” ” );
?>
XML にはもう 1 つの利点があるようです。テキスト バージョンよりもコードがシンプルで簡単です。この XML を保存するには、結果をテキスト形式ではなく XML 形式で保存する別のバージョンの保存関数が必要です。
リスト13.xml2.php
…
関数save()
{
$doc = new DOMDocument();
$doc->formatOutput = true;
$r = $doc->createElement( “config” );
$doc->appendChild( $r );
foreach( $this->items as $k => $v )
{
$kn = $doc->createElement( $k );
$kn->appendChild( $doc->createTextNode( $v ) );
$r->appendChild( $kn );
}
copy( $this->configFile, $this->configFile.’.bak’ );
$doc->save( $this->configFile );
}
…
このコードは、新しい XML ドキュメント オブジェクト モデル (DOM) を作成し、$items 配列内のすべてのデータをこのモデルに保存します。これが完了したら、save メソッドを使用して XML をファイルに保存します。
データベースの利用
最後の代替案は、データベースを使用して構成要素の値を保存することです。最初のステップは、単純なスキーマを使用して構成データを保存することです。以下に簡単なパターンを示します。
リスト14.schema.sql
DROP TABLE IF EXISTS 設定;
CREATE TABLE 設定 (
id MEDIUMINT NOT NULL AUTO_INCREMENT、
名前テキスト、
値TEXT、
プライマリキー(id)
);
これには、アプリケーションの要件に基づいていくつかの調整が必要です。たとえば、構成要素をユーザーごとに保存したい場合は、追加の列としてユーザー ID を追加します。
データを読み書きするために、図 15 に示すように更新された Configuration クラスを作成しました。
リスト15. db1.php
require_once(‘DB.php’);
$dsn = ‘MySQL://root:passWord@localhost/config’;
$db =& DB::Connect( $dsn, array() );
if (PEAR::isError($db)) { die($db->getMessage()) }
クラス構成
{
private $configFile = ‘config.xml’;
private $items = array();
function __construct() { $this->parse(); }
function __get($id) { return $this->items[ $id ]; }
関数__set($id,$v)
{
グローバル $db;
$this->items[ $id ] = $v;
$sth1 = $db->prepare( ‘DELETE FROM settings WHERE name=?’ );
$db->execute( $sth1, $id );
if (PEAR::isError($db)) { die($db->getMessage()); }
$sth2 = $db->prepare(
‘INSERT INTO settings ( id, name, value ) VALUES ( 0, ?, ? )’ );
$db->execute( $sth2, array( $id, $v ) );
if (PEAR::isError($db)) { die($db->getMessage()); }
}
関数parse()
{
グローバル $db;
$doc = new DOMDocument();
$doc->load( $this->configFile );
$cn = $doc->getElementsByTagName( “config” );
$nodes = $cn->item(0)->getElementsByTagName( "*" );
foreach( $nodes as $node )
$this->items[ $node->nodeName ] = $node->nodeValue;
$res = $db->query( ‘SELECT name,value FROM settings’ );
if (PEAR::isError($db)) { die($db->getMessage()); }
while( $res->fetchInto( $row ) ) {
$this->items[ $row[0] ] = $row[1];
}
}
}
$c = new Configuration();
echo( $c->TemplateDirectory.” ” );
$c->TemplateDirectory = '新しい foo';
echo( $c->TemplateDirectory.” ” );
?>
この種の解析方法では、最初にテキストのコンポーネントが最初の値を取得し、次にデータが取得され、さらに最新の値に更新されます。その後、リンクがデータベースから削除され、更新された値を持つ新しいファイルが追加されます。ここに記載されている複数のバージョンを介してどのように構成タイプが本来的に機能するかを確認することは興味深いことであり、このタイプは文書本文、XML、およびデータパッケージからデータを取得し、同じインターフェイスを永続的に維持することができます。オブジェクトのゲストに対して、この動作が具体的にどのように行われるかは不明である。
何は構成及び怎样構成です多数の構成の選択と構成の不足との間で、適切な中間点を選択することは、すべてが困難であるということを認められます。これに加えて、基本的な推奨構成もいくつかあります。
上位の設定では、それぞれの特性に個別の使用/禁止のオプションがあります。アプリケーション プログラムの重要性に応じて、これらのオプションの使用が許可または禁止されます。省スペース状態でも使用可能ですが、同様に設定が必要なため、電子デバイスは省スペース状態でも使用不可であることが通知されます。
ユーザー インターフェイス (UI) は、この設定を 1 つの場所に配置することを選択します。これらはすべて、階層型テーブル (Cascading Style Sheets、CSS) によって配置され、配置システムはこの指定に個別の CSS ファイルを使用します。 CSS は配置文字です。 、スタイル、カラーなどの効果的で活発な方法です。 数多くの CSS ツールがあり、有名なアプリケーションは、図の自動設定ではなく、CSS をうまく利用しています。それぞれの特性において、3 から 10 の構成オプションを設定することを推奨します。これらの構成オプションは、UI 設定を通じて、文書、XML ファイル、およびデータベース内に配置できる場合に限ります。の選択名さらに、これらの選択は、直接界面要素の問題に関連している。
全体として、以下のこれらの選択は構成可能です: 電子コンポーネント、CSS で使用されるファイル内で参照されるシステム ソースの位置、および図形要素のファイル名。また、図形要素については、スキンという名前の独立した配置ファイル タイプを作成することも考えられています。このタイプには、CSS ファイルの位置、図形の位置、およびこれらのタイプの設定を含む、配置ファイルの設定が含まれます。これにより、ユーザは、アプリケーションのインストールをさまざまな製品間で交換できるようになり、アプリケーションの外観と感覚の大幅な改善が可能になります。本文これらのスキン ファイルは保護されませんが、この基本的な知識に基づいて、スキン ファイルのサポートがさらに強化される可能性があります。