PHP - Anwendungskonfigurationsdatei gespeichert, wie - ini, PHP, SQL, im Cache gespeichert, PHP Klasse, JSON, PHP-Array?

StackOverflow https://stackoverflow.com/questions/1809241

Frage

Ich versuche, auf dem besten Weg, zu entscheiden, meine Anwendungen Konfigurationseinstellungen zu speichern. Es gibt so viele Möglichkeiten.

Die meisten Anwendungen, die ich haben, haben eine einfache verwendet gesehen erfordern und eine PHP-Datei, die Variablen enthält. Es scheint weit fortgeschrittene Techniken da draußen zu sein.

Was haben Sie verwendet? Was ist am effizientesten? Was ist die sicherste?

War es hilfreich?

Lösung

Das Beste, was Sie tun können, ist die einfachste Sache, die möglicherweise (PHP-Variablen funktionieren könnte ) und wickeln sie es in einer Klasse auf. Auf diese Weise können Sie die Implementierung später ändern, ohne dass Client-Code zu ändern. Erstellen Sie eine Schnittstelle, die die Konfigurationsklasse implementiert und den Client-Code macht die Interface-Methoden verwenden. Wenn Sie später zum Speichern von Konfigurations in einer Datenbank oder JSON entscheiden oder was auch immer, können Sie einfach tauschen die bestehende Implementierung durch einen neuen aus. Stellen Sie sicher, dass Ihre Konfigurationsklasse ist prüfbar und schreiben Unit-Tests.

Andere Tipps

Wir verwenden eine Datei Local.php genannt, die aus dem SCM-System ausgeschlossen. Es enthält mehrere Konstanten oder globale Variablen. Zum Beispiel:

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

Und es kann auf bezeichnet wird überall einfach durch:

Setting::URL

Wenn Sie die Einstellungen müssen zur Laufzeit beschreibbar sein, empfehle ich Ihnen stattdessen öffentliche statische Variablen verwenden.

Versuchen Sie php-Arrays Konfigurationsdateien verwenden hier beschriebene Technik zu verwenden: http://www.dasprids.de/blog/2009/05/08/writing-powerful-and-easy-config-files-with-php-arrays

Mit dieser Methode können Sie App-Konfiguration auf diese Weise schreiben: app.config.php

<?php

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

Diese Methode ist sicher, Cache-fähig durch Opcode Cacher (APC, xcache).

Ich finde Zend_Config sein eine gute Lösung. Sie können die Konfiguration von einem einfachen Array laden eine INI-Datei Stil oder von einem XML-Dokument . Unabhängig davon, welche Sie sich entscheiden, das Konfigurationsobjekt ist das gleiche, so dass Sie Speicherformate frei schalten können. Zend_Config Objekte können auch zusammengefügt werden, je nach Anwendung kann dies sinnvoll sein (eine Serverkonfiguration, dann eine pro Standort / Installation config).

Wie bei den meisten (oder alle) Dingen im Zend Framework, Sie leicht Zend_Config selbst verwenden können.

In Anbetracht Effizienz , ich die schnellste Methode, um ein Array zu verwenden wäre würde sagen, da dies weniger erfordert (in diesem Fall keine) Zeichenfolgenanalyse. Jedoch kann eine INI / XML-Format für einige leichter zu pflegen. Natürlich einige Caching würden Sie das Beste aus beiden Welten.

Auch mit INI-Dateien mit Zend_Config erlauben Sie Abschnitte von Konfigurationen zu definieren, die voneinander erben. Die häufigste Anwendung ist eine ‚Entwicklung‘ Abschnitt, der von der ‚Produktion‘ Abschnitt erbt, dann definiert die DB / Debug-Einstellungen.

Wie für die Sicherheit , hält die Config-Datei aus dem Web-Root ist der erste Schritt. So dass es nur lesen und die Beschränkung des Zugangs könnte es machen mehr sicher; jedoch abhängig von Ihrem Hosting / Server-Konfiguration, die Sie in beschränkt sein, was kann es geschehen.

Wie wäre:

; <?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

Speichern unter config.php (oder so ähnlich muss PHP-Erweiterung haben), und dann laden Sie es einfach mit:

parse_ini_file('config.php', true);

Und man konnte verwenden

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

eine Standard-Konfigurationsdatei mit einer spezifischeren Config-Datei verschmelzen.

Der Punkt hier ist, dass Sie das sehr gut lesbar ini-Format verwenden können, aber dennoch in der Lage sein, Ihre Konfigurationsdatei in einem öffentlichen Verzeichnis haben. Wenn Sie die Datei mit Ihrem Browser öffnen, wird PHP es zuerst analysieren und das Ergebnis geben, die nur werden „; Direkten Zugang nicht erlaubt;“. Wenn Sie die Datei direkt als eine INI-Datei analysieren, wird die PHP-Chip-Anweisung kommentiert gemäß der ini-Syntax (;). So wird es keine Auswirkungen hat, dann

Um nur ein Beispiel dafür, wie eine zentrale XML / Xpath Konfiguration zu implementieren.

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

Beispielaufruf

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

Aus meiner Sicht eine gute Lösung wäre ini-Dateien sein.

Ich ziehe Config-Datei nicht Arrays / Variablen zum Speichern von Einstellungen; hier ist der Grund:

Was passiert, wenn ein Benutzer versehentlich umbenannt Ihre Einstellung Variable?
Was passiert, wenn eine Variable mit ähnlichen Namen wird an anderer Stelle auch vom Benutzer definiert?
Variablen in der Konfigurationsdatei kann einige, wo tief im Skript überschreibt oder sogar darin enthaltenen Dateien.
und möglicherweise mehr Probleme ....

Ich mag INI-Datei verwenden, um Anwendungen meiner php Einstellung. Hier ist der Grund:

Es ist Abschnitt basiert
Es ist einfacher,
Sie können Werte von freundlichen Namen gesetzt
Sie müssen sich keine Sorgen über Variablen überschrieben werden, weil es keine Einsen sind.
Kein Konflikt von Variablen natürlich. Es ermöglicht mehr Flexibilität bei den Arten von Werten angeben.

. Hinweis: Sie müssen mit parse_ini_file Funktion INI-Dateien lesen

Am besten ist es jede Kern-Konfiguration in PHP selbst zu tun, aber wenn Sie eine Datenbank verwenden und nicht den zusätzlichen Aufwand etwas dagegen - kann man ein gewisse Flexibilität bei der Speicherung einiger Einstellungen in der Datenbank mit einer einzigen zusätzlichen Abfrage finden (unter der Annahme, Sie organisieren es richtig).

So oder so, diese Daten im JSON-Speichern, INI, XL, etc. ist nur eine andere unnötige Abstraktion, die viel zu viel heute auf dem Netz durchgeführt wird. Ihre beste Wette ist reine PHP, wenn Sie die Flexibilität einiger Einstellungen wie in der Datenbank sein.

Der einzige Grund, warum ich mir vorstellen kann, um nicht php vars wie andere vorschlagen, ist, wenn Sie zwischen den Konfigurationen in einer kontrollierten Art und Weise wechseln müssen, so dass es Daten / Verhalten Konsistenz während des Umschaltens. Zum Beispiel, wenn Sie Datenbanken sind Schalen, dann könnte das System gesperrt schreiben, bis die Umschaltung erfolgt (ghost-Schreibvorgänge zu verhindern, aber Dirty Reads sind noch möglich).

Wenn das so ein Problem ist, dann könnten Sie eine spezielle Admin-Seite in Ihrer Anwendung (pref lokalen Zugriff nur für die Sicherheit) schreiben, die das System vorübergehend sperrt, dann liest und setzt alle Änderungen vor dem Entriegeln.

Wenn Sie eine stark frequentierte Website ausgeführt wird, wo Konsistenz Angelegenheiten, das etwas ist, Sie werden zu betrachten. Wenn Sie außerhalb der Geschäftszeiten bereitstellen können, wenn wenig / kein Verkehr, dann PHP Vars oder andere Standard-Textformate in Ordnung sein werden.

Ich mag die Idee von „Namensräumen“ oder eine Art von Baum mit

so können Sie haben:

db.default.user

oder

db.readonly.user

und so weiter.

jetzt Code in Bezug auf was ich getan habe eine Schnittstelle für den Config-Leser war. So können Sie einen Speicherleser haben, Array-Leser, db Leser, etc

und eine Config-Klasse, die die Leser verwendet und ermöglicht es Ihnen, eine Config von jeder Art von Quelle haben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top