PHP - Anwendungskonfigurationsdatei gespeichert, wie - ini, PHP, SQL, im Cache gespeichert, PHP Klasse, JSON, PHP-Array?
-
05-07-2019 - |
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?
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