PHP: Yapılandırma verilerini kaydetmek için doğru bir yöntem var mı?

8 Cevap php

Ben inşa ediyorum bir web uygulamasında bir config.inc dosyası var. Ben bu veritabanı sunucusu, giriş / parola vb sorar basit bir form kullanılarak girilen istiyorum MySQL veritabanı, vb gibi şeyler için yapılandırma değerleri ile bir dizi içerir, daha sonra bu yazılı olsun yapılandırma dosyası.

Bunu yapmanın tercih edilen bir yöntem var mı? Ben bir dosyaya yazmak, ve bir dizi güncellemek için nasıl emin değilim.

8 Cevap

Sadece, doğru yazma istiyorum? Bu tefrika dizidir ya da çözümlenir?

Bir config dosyası okumak için bir yoludur parse_ini_file(). Ben mutlaka tercih çağrı değildir, ama bu bir yöntem. Hala dosyası yazmak gerekiyordu.

Başka bir yolu da "config.inc.php" yazmak ve sadece dahil, yazmak için sen edersin sadece çıkış gerçek PHP kodu (örneğin, $ var = "myval" ;). Etmek istiyorum

Bu, bir ilişkisel dizi $ geneli varsayarak, bir yapılandırma değerleri dizi ve isim = değer olarak çıktı onları aldı, basit bir "çıkış" fonksiyonunu yazabilirsiniz bir yoludur.

foreach ($config as $name => $value) {
   $output .= $name . '=' . $value . "\n";
}

if (!file_put_contents($filename, $output)) {
    die("Error writing config file.");
}

Bunu yapmak için iyi bir yolu bir sürü var. Bu gerçekten ihtiyaçlarına dayalı. O need belirli bir formatta olması mı yoksa gecikmeyi var mı?

It is not recommended to modify PHP configuration files via your application, you should use CSV files or a database table. In case you want to save it in a CSV file then I suggest you keep a CSV file for each configuration type (e.g CSV file for database configurations) and always overwrite the previous one using file_put_contents

Veri örneği Kaydet:

$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));

Yük verileri Örnek:

$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..
}

Ben kullanıcı, şifre, şema, yolları, vs yani elle değiştirerek o çünkü var_export değil kullanarak, genellikle elle değiştirilmiş olacak şeyler çünkü bir ini dosyasını kullanarak, akıllıca bir seçenek olduğuna inanıyorum Eğer PHP sözdizimi bir hata yaparsanız o kadar temiz değil ve uygulama çökebilir.

Fakat büyük ini dosyalarını ayrıştırma pahalı olabilir, bu nedenle var_export() veya serlialize() ile ini önbelleğe Tamam olurdu. Bu daha iyi bir seçim, bence, ve önbellek dosya var değil sadece ini okudum.

Peki, fwrite () php fonksiyonu istediğiniz tam olarak ne yapar, bir dosyayı yazmak için. Onun PHP.NET dokümantasyon sayfasından (aşağıdaki örneğe bakın).

Şimdi, bu dosyaya çıktı ne gibi soru üzerine -. Ben bu dosyayı varsayarak kulüpler projenin geri kalanı içine bir yapılandırma php dosyası olarak dahil edilmesi gerekir. Ben böyle bir şey yapacağım hayal ediyorum - Eğer teslim şekline dayanarak, anında PHP kodu ile dizeleri oluşturma nereye:

$strDatabaseConfig = "\$databaseConfig = array('" . $_POST['login'] . "," . $_POST['password'] . "');";

Ve burada fwrite için snippet bulunuyor:

$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";
}

PHP Bunun için özel bir işlevi vardır, onun adı var_export();

Sadece yapın:

file_put_contents("config.php",var_export($config,true));

Ben tanımlamak tabloların bir grup ile bir dosya olmasını tercih.

Bunlar yapılandırma ayarları için gereken ne olduğu mevcut küresel (ve elbette değişmez) sabitleri vardır.

Bu değiştirilebilir, böylece onlar bir değişken tarafından gerekli ekstra belleğe ihtiyaç yok gibi sabitleri okuma daha iyi bellek yönetimi ve verimlilik sunuyor.

Senin config.inc dosyası gibi görünüyor diyelim:

$config = array(
    'blah'  => 'mmm',
    'blah2' => 'www',
    //...
);

Akım değerleri ile metin alanları doldurun, size bunu güncellemek istiyorum, bu yüzden basit bir form oluşturun. Geçerli yapılandırmayı yazar PHP script şöyle olabilir:

$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));

Ve bitirdiniz.