config.inc
構築中の Web アプリケーションにファイルがあります。MySQLデータベースなどの構成値を含む配列が含まれています。サーバー、データベースのログイン/パスワードなどを要求する単純なフォームを使用してこれらを入力したいと思います。構成ファイル。
これを行うための好ましい方法はありますか?ファイルへの書き込み方法と配列の更新方法がわかりません。
あなたはただ書きたいだけですよね?シリアル化された配列ですか、それとも解析されていますか?
構成ファイルを読み取る 1 つの方法はparse_ini_file()です。必ずしも好ましいとは言えませんが、方法です。あなたはまだファイルを書く必要があります。
もう 1 つの方法は、「config.inc.php」を記述してインクルードするだけで、実際の PHP コードを出力するだけです (例: $var = "myval";)。
これは、$config が連想配列であると仮定して、構成値の配列を取り、それらを name=value として出力する単純な「出力」関数を作成する方法です。
foreach ($config as $name => $value) {
$output .= $name . '=' . $value . "\n";
}
if (!file_put_contents($filename, $output)) {
die("Error writing config file.");
}
まともな方法はたくさんあります。それは本当にあなたの要件に基づいています。特定のフォーマットである必要がありますか、それとも余裕がありますか?
PHP にはこれ専用の関数があり、var_export();と呼ばれます。
ただ行う:
file_put_contents("config.php",var_export($config,true));
アプリケーションを介して PHP 構成ファイルを変更することはお勧めしません。CSV ファイルまたはデータベース テーブルを使用する必要があります。CSV ファイルに保存する場合は、構成タイプごとに CSV ファイル (データベース構成用の CSV ファイルなど) を保持し、常に file_put_contents を使用して前のファイルを上書きすることをお勧めします。
セーブデータ例:
$csvStructure = array("dbUser","dbPassword","dbHostname","dbPort"); // array used for both loading data and saving it
$csvData = array();
foreach ($csvStructure as $field) {
$csvData[] = $_POST[$field]; // so it'd get $_POST["dbUser"],$_POST["dbPasword"], etc..
}
file_put_contents("filename",implode("\t",$csvData));
負荷データの例:
$csvStructure = array("dbUser","dbPassword","dbHostname","dbPort"); // array used for both loading data and saving it
$dbConfig = array();
$csvData = explode("\t",file_get_contents("filename"));
foreach ($csvStructure as $key => $field) { // $key would have the location of the requested field in our CSV data (0,1,2, etc..).
$dbConfig[$field] = $csvData[$key]; // populate $dbConfig["dbUser"],$dbConfig["dbPasword"], etc..
}
ユーザー、パスワード、スキーマ、パスなどは通常手動で変更するものであるため、ini ファイルを使用することは賢明なオプションだとvar_export
思います。 PHP の構文を間違えた場合は、アプリケーションにエラーが発生します。
ただし、大きな ini ファイルの解析にはコストがかかる可能性があるため、var_export()
またはを使用して ini をキャッシュしても問題ありませんserlialize()
。キャッシュ ファイルが存在しない場合にのみ ini を読み取る方がよいと思います。
私は、一連の定義ステートメントを含むファイルを用意することを好みます。
これらは、構成設定に必要な、グローバルに使用可能な (そしてもちろん不変の) 定数です。
定数は、変数を変更するために必要な余分なメモリを必要としないため、より優れたメモリ管理と読み取りの効率を提供します。
ここに 1 つの方法があります: wp-admin/setup-config.php
WordPress から。
さて、ファイルを書き込むには、fwrite() php 関数はまさにあなたが望むことを行います。その PHP.NET ドキュメント ページから (以下の例を参照)。
ここで、そのファイルに何を出力するかという質問について - 私は、そのファイルを構成 .php ファイルとしてプロジェクトの残りの部分に含める必要があると想定しています。送信されたフォームに基づいて、その場で PHP コードを使用して文字列を作成している場合、次のようなことを行うと思います。
$strDatabaseConfig = "\$databaseConfig = array('" . $_POST['login'] . "," . $_POST['password'] . "');";
fwrite のスニペットは次のとおりです。
$filename = 'test.txt';
$somecontent = "Add this to the file\n";
// Let's make sure the file exists and is writable first.
if (is_writable($filename)) {
// In our example we're opening $filename in append mode.
// The file pointer is at the bottom of the file hence
// that's where $somecontent will go when we fwrite() it.
if (!$handle = fopen($filename, 'a')) {
echo "Cannot open file ($filename)";
exit;
}
// Write $somecontent to our opened file.
if (fwrite($handle, $somecontent) === FALSE) {
echo "Cannot write to file ($filename)";
exit;
}
echo "Success, wrote ($somecontent) to file ($filename)";
fclose($handle);
} else {
echo "The file $filename is not writable";
}
config.inc ファイルが次のようになっているとします。
$config = array(
'blah' => 'mmm',
'blah2' => 'www',
//...
);
それを更新したいので、単純なフォームを作成し、テキスト フィールドに現在の値を入力します。現在の構成を上書きする PHP スクリプトは次のようになります。
$newConfig = ...; // data from form - of course validate it first
$config = ...; // data from config.inc
$config = array_merge($config, $newConfig);
file_put_contents('config.inc', '<?php $config = ' . var_export($config, true));
これで完了です。