In der Entwicklung von php-basierten Anwendungen besteht in vielen Fällen die Notwendigkeit, Konfigurationsparameter in eine externe Konfigurationsdatei auszulagern. Dadurch hat man programmseitig die Möglichkeit Konfigurationsparameter dynamisch einzulesen und damit die Anwendung auf unterschiedliche Umgebungen leichter anzupassen.
Es gibt unterschiedliche Formate von Konfigurationsdateien in denen man Parameter ablegen kann. Damit man die Konfiguationsparameter in einer strukturieten Form abgespeichert werden, empfiehlt sich das XML-Format.
Nehmen wir für diese Beispiel die folgende XML Struktur (conf.xml) mit den Konfigurationsparametern für einen Datenbank- und einen Email-Server:
Damit man von der Anwendug aus auf die Konfigurationsparameter innerhalb der Datei zugreifen kann, macht es Sinn eine PHP Klasse zu schreiben. Man muss sicherlich an vielen Stellen innerhalb der Anwendung zugreifen, daher eignet sich die Realisierung als PHP Klasse:
<?php /* this class manages the xml configuration file conf.xml usage in code is like this: include_once('conf/class_conf.php'); $config = new Config; */ class Config { function __construct(){ /* on class initial, read the config into object ->xml */ $this->xml = $this->get_config(); } function get_config(){ /* this function reads the configuration values from conf.xml and represent everything as xml construct if an error occured while processing: CLASS_CONFIG_CAN_NOT_READ_CONFG_FILE */ /* reading the conf.xml */ if (file_exists('conf/conf.xml')) { $xml = simplexml_load_file('conf/conf.xml'); } else { throw new Exception('CLASS_CONFIG_CAN_NOT_READ_CONFG_FILE'); } return $xml; } function save_config($config){ /* this function save xml config to the conf.xml file the function needs the entire xml contruct. before saving the new values to the conf.xml there will be a backup file created (conf.xml.bak) each time the function is fired if an input is empty, we throw an exception: $config -> CLASS_CONFIG_NO_VALID_XML_GIVEN if an error occured while processing: CLASS_CONFIG_CAN_NOT_CREATE_BACKUP_FILE CLASS_CONFIG_CAN_NOT_CREATE_FILE_HANDLE CLASS_CONFIG_CAN_NOT_SAVE_CONFIG */ /* checking input $config */ if(empty($config)){ throw new Exception('CLASS_CONFIG_NO_VALID_XML_GIVEN'); } /* creating the backup file conf.xml.bak */ if (!copy('conf/conf.xml', 'conf/conf.xml.bak')) { throw new Exception('CLASS_CONFIG_CAN_NOT_CREATE_BACKUP_FILE'); } /* save the config conf.xml file */ try{ $handle = fopen("conf/conf.xml", "w"); if(!empty($handle)){ fputs ($handle, $config->asXML()); fclose ($handle); }else{ /* if we can not save to xml conf */ throw new Exception('CLASS_CONFIG_CAN_NOT_CREATE_FILE_HANDLE'); } }catch (Exception $e){ /* if we can not save to xml conf */ throw new Exception('CLASS_CONFIG_CAN_NOT_SAVE_CONFIG'); } fclose($handle); } } ?> |
Diese Klasse bietet einige Funktionen. Beim Instanzieren der Klasse, wird im Bereich des Kontructors die XML-Datei conf.xml geöffnet und in ein XML Konstrukt eingelesen. Innerhalb der PHP-Anwendung kann man auf die einzelnen Konfigurationsparameter sehr leicht zugreifen. Ein Beispiel um den gespeicherten Wert des Datenbank-Host auszulesen:
$datenbank_host = $config->xml->db->host; |
oder ein weiteres Beispiel für das Auslesen den SMTP Port:
$email_port = $config->xml->smtp->port; |
Eine weitere Funktion diese Klasse ist das Abspeichern von ggf. geänderten Konfugrationsparameter über die Funktion save_config():
$config->save_config($config->xml); |
Um einen Parameter zu ändern, muss man lediglich vor dem Abspeichern den XML Knoten bearbeiten. Im Folgenden Beispielcode ändere ich den Namen des Datenbankservers und speiche die Änderung direkt in die Konfigurationsdatei:
$config->xml->db->host = 'neuer name des datenbankservers'; $config->save_config($config->xml); |
Eine korrespondierende Funktion dieser Klasse erstellt ein Backup (eine Sicherheitskopie) der aktuellen conf.xml Datei vor dem Speichern. Für das Auslösen dieser Funktion muss man nichts aktiv in der eigenen Anwendung machen. Das regelt die PHP Klasse vollkommen eigenständig.