2010-10-08 10 views
7

Hinweis: Die Konfiguration wird in einer PHP-Datei gespeichert, config.php.Was ist der beste Weg (Coding-weise), Systemkonfiguration in einer PHP-Anwendung zu speichern?

Ich habe dies anders gemacht gesehen, hier ist eine kurze Liste von Beispielen (ich Speicherung DB info in diesen Beispielen):

Konstanten: global, Nur-Lese-

define('DB_USER','user12'); 
define('DB_PASS','21user'); 

Mit GLOBALS-Array: global, veränderbar, sich wiederholend, gemischt mit anderen Globals

$GLOBALS['DB_USER']='user12'; 
$GLOBALS['DB_PASS']='21user'; 

einer nicht-globalen Array aber globaly angehoben: möglicherweise schlimmer als die zweite Option

$config=array(); ... 

$config['DB_USER']='user12'; 
$config['DB_PASS']='21user'; 

... global $config; 
    mysql_connect('localhost',$config['DB_USER'],$config['DB_PASS']); 

definieren Klasseneigenschaften: (global, zählbare)

class Config { 
    public $DB_USER='user12'; 
    public $DB_PASS='21user'; 
} 

Kriterien/Optionen/Eigenschaften:

  • einfache Codierung: Sie würde nicht, wenn die überprüfen möchten Einstellung existiert, oder initialisieren
  • Leichtigkeit der Änderung: ein Nicht-Programmierer/Laie könnte leicht die Einstellungen ändern
  • in einem sauberen Ort gespeichert: nicht mit anderen Variablen gemischt
  • Runtime-Modifikation (kann in einem Sub-Array gespeichert werden): in einigen Fällen andere Devs vorhandene Einstellungen

ändern können leicht

Die Konfiguration muss möglicherweise während der Ausführung des Systems einige Zeit geändert werden, so dass Option 1 bereits nicht realisierbar ist. Die dritte Option ist auch nicht zu sauber.


Während ich dies schreibe, bekomme ich eine große Warnung, dass die Diskussion subjektiv und geschlossen ist. So bitte halten Sie sich an das Thema und geben Sie gute Gründe für Ihre Antworten.


Dies ist eine ziemlich offensichtliche Frage, und bedenkt, dass ich mit unterschiedlichen Antworten gut vertraut bin, könnten Sie fragen, warum bin ich die ganze Aufregung zu machen? Die Sache ist, ich entwickle einen Rahmen, und im Gegensatz zu einem anderen Framework (* ahem * joomla * ahem *) möchte ich nicht ihren Fehler durchmachen, eine fehlgeleitete Lösung einzuwerfen, die am Ende geändert werden muss/in Zukunft neu gedacht.


Edit: Zunächst, die Lage der Konfigurationsdatei geht mich nichts an. Ich werde sicherstellen, dass die Leute den Standort leicht ändern können, wenn sie das möchten, aber dies ist keine Anforderung. Erstens, billige Webhosts erlaubt dies nicht zu tun, zweitens, soweit die Sicherheit geht, ist dies wirklich keine gute Option. Warum? Denn das Framework muss wissen, wo die Konfiguration ist. Wirklich, Sicherheit durch Dunkelheit funktioniert nicht.Ich würde lieber alle RFI und XSS (zum Beispiel) reparieren als paranoid beim Ausblenden der Konfigurationsdatei unter mehreren Ebenen.

+1

mögliche Duplikate von [Was ist der beste Weg, um Konfigurationsvariablen in PHP zu speichern?] (Http: // stackoverflow .com/questions/593440/Was ist der beste Weg zur Speicherung der Konfigurationsvariablen in PHP? – alex

+0

'Die Konfiguration muss möglicherweise während der Ausführung des Systems geändert werden, also Option 1 ist schon nicht machbar - hört sich nicht nach einem sehr guten System an! Die ganze Idee einer Konfigurationsdatei ist, dass Sie ** Konstanten ** mit allgemeinen Seiteneinstellungen wie Datenbankeinstellungen, vielleicht Seitentiteln usw. definieren. Welche Art von Dingen speichern Sie, die Sie vielleicht ändern möchten? – chigley

+0

So funktioniert es: Eine PHP-Klasse, Datenbank, arbeitet mit den Konfigurationskonstanten DB_?, Möchte vielleicht ein Skript schreiben, um zwei DBs zu synchronisieren (als Beispiel), kann aber die Datenbank-Klasse nicht verwenden, weil er nicht kann Ändere die Konstanten .... ok das ist ein ziemlich lahmes Beispiel, ich kann mir keinen besseren vorstellen. Hoffe, du hast die Idee, tho. – Christian

Antwort

2

Warum nicht Zend_Config verwenden? Es erstellt eine gemeinsame Schnittstelle für Konfigurationsoptionen, die in einer Konfigurationsdatei oder einer Datenbank (mit einem geeigneten Adapter) gespeichert werden können. Und es ist leicht; Sie müssen nicht das gesamte Zend-Framework mitbringen, um es zu benutzen.

BTW, da Sie ein Framework erstellen, sollten Sie die Verschmutzung des globalen Namensraums auf ein Minimum reduzieren. Etwas wie Ihre 3. Option, und wenn Sie ausschließlich auf 5.3 abzielen, sehen Sie sich die richtigen Namespaces an.

+0

Ich werde nicht das Framework von jemand anderem benutzen. Plus, wenn sie ihr eigenes Config-System haben, das gut genug ist, kann ich es wahrscheinlich in meinem Code replizieren. – Christian

+0

+1 zu Ihrem zweiten Absatz, während dabei möchte ich erwähnen, dass ich nicht zielen auf 5.3 + – Christian

+0

Found diesen sehr nützlichen Artikel: http://devzone.zend.com/article/1264 – Christian

0

Fügen Sie eine gemeinsame Datei ein und fügen Sie sie überall hinzu. Der Vorteil, wenn Sie live gehen oder zu Ihrem Testserver wechseln, Sie müssen nur diese eine Datei bearbeiten und alle Konfigurationen werden geändert. Methode 2 ist besser, da Sie es ändern können.

Denken Sie daran, wenn Sie mysql verbinden, wenn Sie den Benutzer ändern müssen und übergeben Sie müssen neu verbinden

+0

Sorry, habe nicht erwähnt, dass ich bereits die Single-File-Included-Everywhere-Option verwendet ... wird Thema aktualisieren. – Christian

4

Hartcodierte Daten sind möglicherweise keine Option, bei der die Rekonfiguration nicht code-fähig ist. Erwägen Sie die Verwendung von parse_ini_file().

+0

Der Teil über Benutzer, die nicht Code-Adept sind, sind ein wirklich gutes Argument.Allerdings habe ich Angst, ini-Dateien zu verwenden, da sie herunterladbar sind, und natürlich möchten Sie nicht, dass Leute eine Konfigurationsdatei herunterladen, die die FTP-Daten Ihres Servers enthält. :-) – Christian

+0

Verwenden Sie nicht die INI-Dateierweiterung. Verwenden Sie stattdessen etwas anderes. Oder speichern Sie die Datei in einem nicht für den Web zugänglichen Pfad. – stillstanding

+0

Wenn ich die Datei nicht über htaccess verstecke (viele Möglichkeiten, aber es sieht wie ein Hack für mich aus), ist die einzige praktikable Option eine PHP-Erweiterung mit '[]' am Anfang der Datei, um den Parser zu stoppen habe immer noch eine gültige ini-datei - auch das hört sich nach schlechtem design/hack an. – Christian

1

Ein bisschen spät, aber dies könnte für Sie interessant sein: http://milki.include-once.org/genericplugins/genconfig.html

Es bietet eine einfache API PHP-Konfigurationsdateien in-place zu bearbeiten. Es behält Kommentare und anderen Code intakt. Und es erlaubt ein globales $ config array/ArrayObject und definiert Konstanten. Es funktioniert fast automatisch, wenn es mit Kommentaren zur Plugin-Konfiguration kombiniert wird. Es ist jedoch eine Menge Code. Aber vielleicht lohnt es sich, nach dem Konzept Ausschau zu halten. (Ich benutze auch eine lesbare config.php, da es das nützlichste Konfigurationsformat für mich zu sein scheint.)