PHP - Uygulama yapılandırma dosyası olarak depolanır - ini, php, sql, önbelleğe alınmış, php class, JSON, php dizi?

10 Cevap php

Benim uygulamalar için yapılandırma ayarlarını depolamak için en iyi şekilde karar çalışıyorum. Bu kadar çok seçenek vardır.

Gördüğüm uygulamaların çoğunluğu basit gerektiren ve değişkenleri içeren bir PHP dosyası kullandık. Orada çok daha ileri teknikler var gibi görünüyor.

What have you used? What is most efficient? What is most secure?

10 Cevap

Yapabileceğiniz en iyi şey, the simplest thing that could possibly work (php değişkenler) ve bir sınıfta o kadar sarın. Bu şekilde, herhangi bir istemci kodu değiştirmeden sonra uygulanmasını değiştirebilirsiniz. Yapılandırma sınıf uygulayan bir arayüz oluşturmak ve istemci kod arabirim yöntemleri kullanmaya dikkat edin. Daha sonra bir veritabanı veya JSON veya herneyse mağaza yapılandırmaya karar verirseniz, sadece bir yenisi ile mevcut uygulama takas edebilirsiniz. Konfigürasyon sınıf test edilebilir ve yazma birim testler olduğundan emin olun.

Biz SCM sistemi dışlanan Local.php hangi adında bir dosya kullanın. Birkaç sabitleri veya global değişkenleri içerir. Örneğin:

// Local.php
class Setting
{
   const URL = 'http://www.foo.com';
   const DB_User = 'websmith';
}

Ve anywhere sadece tarafından ifade edilebilir:

Setting::URL

Eğer ayarları zamanında yazılabilir olması gerekiyorsa, ben bunun yerine genel statik değişkenleri kullanmanızı öneririz.

Burada anlatılan tekniği kullanarak php-diziler yapılandırma dosyaları kullanmak için deneyin: http://www.dasprids.de/blog/2009/05/08/writing-powerful-and-easy-config-files-with-php-arrays

This method allows you to write app configuration in this way: app.config.php

<?php

return array(
  'appname' => 'My Application Name',
  'database' => array(
    'type' => 'mysql',
    'host' => 'localhost',
    'user' => 'root',
    'pass' => 'none',
    'db' => 'mydb',
  ),
);

Bu yöntem güvenli, önbellek-mümkün opcode cachers (APC, XCache) tarafından.

I find Zend_Config to be a good solution. You can load the configuration from a simple array, an INI style file arasında ya da an XML document. Hangisini seçerseniz seçin, yapılandırma nesne aynı, yani özgürce depolama biçimlerini geçiş yapabilirsiniz. Zend_Config nesneler de uygulamanıza bağlı olarak, bu (daha sonra bir başına sitesi / kurulum yapılandırma, bir sunucu config) yararlı olabilir, birleştirilmiş olabilir.

Zend Framework çoğu (veya tüm) şey olduğu gibi, kolayca Zend_Config kendisi tarafından kullanabilirsiniz.

Considering efficiency, ben bu dize ayrıştırma (bu durumda hiçbir in) daha az gerektirir beri en hızlı yöntem, bir dizi kullanmak olacağını söyleyebilirim. Ancak, INI / XML formatında bazı korumak için daha kolay olabilir. Tabii ki bazı önbelleğe size her iki dünyanın en iyi verecek.

Ayrıca, INI dosyaları kullanarak Zend_Config birbirlerine devralan yapılandırmaları bölümlerini tanımlamak için izin verir. En yaygın kullanımı DB / hata ayıklama ayarlarını yeniden tanımlıyor, sonra 'üretim' bölümünde devraldığı bir 'gelişme' bölümü.

As for security, yapılandırma dosyası tutmak out of the web root ilk adımdır. Sadece okuma yapma ve erişimi kısıtlayarak o more güvenceye yapabilir; Ancak, hosting / sunucu yapılandırmasına bağlı olarak orada ne yapılabilir sınırlı olabilir.

Nasıl hakkında:

; <?php die('Direct access not allowed ;') ?>
; The above is for security, do not remove

[database]
name = testing
host = localhost
user = root
pass = 

[soap]
enableCache = 1
cacheTtl = 30

(Ya da bunun gibi bir şey php uzatım olması gerekir) config.php olarak kaydetmek ve sonra sadece ile yükleyebilirsiniz:

parse_ini_file('config.php', true);

Ve sen kullanabilirsiniz

array_merge_recursive(parse_ini_file('config-default.php', true), parse_ini_file('config.php', true))

daha özel bir yapılandırma dosyası ile bir varsayılan yapılandırma dosyası birleştirmek.

The point here is that you can use the very readable ini format, but still be able to have your config file in a public directory. When you open the file with your browser, php will parse it first and give you the result, which will just be "; Direct access not allowed ;". When you parse the file directly as an ini file, the php die statement will be commented out according to the ini syntax (;) so it will not have any effect then.

Merkezi bir XML / XPath yapılandırmasını nasıl uygulanacağı sadece bir örnektir.

class Config {
    private static $_singleton;
    private $xml;
    static function getInstance() {
        if(is_null (self::$_singleton) ) {
                self::$_singleton = new self;
        }
        return self::$_singleton;
    } 
    function open($xml_file) {
        $this->xml = simplexml_load_file($xml_file);
        return $this;
    }
    public function getConfig($path=null) {
        if (!is_object($this->xml)) {
            return false;
        }
        if (!$path) {
            return $this->xml;
        }
        $xml = $this->xml->xpath($path);
        if (is_array($xml)) {
            if (count($xml) == 1) {
                return (string)$xml[0];
            }
            if (count($xml) == 0) {
                return false;
            }
        }
        return $xml;
    }
}

Örnek çağrı

Config::getInstance()
    ->open('settings.xml')
    ->getConfig('/settings/module/section/item');

Benim görüşüme göre iyi bir çözüm ini dosyalar olurdu.

Ben ayarları saklamak için diziler / değişkenleri kullanarak yapılandırma dosyasını tercih etmiyor; neden burada:

What if a user accidently re-named your setting variable?
What if a variable with similar name is defined elsewhere too by the user?
Variables in config file may be overwritten some where deep in the script or even included files.
and possibly more problems....

Benim php apps ayarı ini dosyasını kullanmak ister. Burada neden:

It is section based
It is easier
You can set values by friendly names
You don't have to worry about variables being overwritten because there are no ones.
No conflict of variables of course. It allows more flexibility in specifying the types of values.

Not: ini dosyaları okumak için parse_ini_file işlevini kullanmanız gerekir.

PHP'nin kendisi herhangi bir çekirdek yapılandırma yapmak en iyisidir, ancak bir veritabanı kullanıyorsanız ve ekstra yükü sakıncası yoksa - Eğer bunu organize varsayarak (tek bir ekstra sorgu ile veritabanında bazı ayarları saklamak bazı esneklik bulabilirsiniz düzgün).

Her iki şekilde de, vb JSON, INI, XL, bu verileri depolamak web üzerinde günümüzde çok fazla yapılır sadece başka gereksiz bir soyutlama değildir. Eğer veritabanında olmanın bazı ayarların esnekliği gibi sürece en iyi bahis, saf PHP.

Eğer kontrollü bir şekilde yapılandırmaları arasında geçiş sırasında yani orada veri / davranış tutarlılığı geçmek için gerekiyorsa ben başkalarının önerdiği gibi php vars kullanmak için aklınıza gelebilecek tek nedeni budur. Eğer veritabanları gectiginize Örneğin, switch üzerinde meydana gelene kadar sistemi (hayalet-yazar önlemek için, ama kirli okuma hala mümkün) kilitli yazabilirsiniz.

Bu gibi şeyler bir endişe varsa, o zaman o zaman okur ve açma önce tüm değişiklikleri dağıtır, geçici sistemini kilitleyerek uygulaması (sadece güvenlik için pref yerel erişim) özel bir yönetici sayfasını yazabilirsiniz.

Eğer tutarlılık önemli bir yüksek trafik sitesi çalıştıran ediyorsanız, bu dikkate almak isteyeceksiniz şeydir. Az / hiç trafik yokken kapalı saatlerinde dağıtabilir, o zaman php değişkenler veya diğer standart metin biçimleri iyi olacak.

Ben "ad" ya da ağacın çeşit sahip fikir gibi

böylece sahip olabilir:

db.default.user

veya

db.readonly.user

ve benzerleri.

now regarding code what I did was an interface fveya the config readers: so you can have a memveyay reader, array reader, db reader, etc.

ve bu okuyucuları kullanır ve kaynağı her türlü bir config sağlayacak bir yapılandırma sınıfı