PHP Verständnisfrage Include_once/Require_once

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
565
Hallo,

ich habe geräde ein Verständnisproblem zum Thema Include_once/Require_once.

Innerhalb meiner index.php lade ich eine Config-Datei mit Variabeln.
Angenommen innerhalb der index.php verändere ich diese Werte, so werden diese nach dem Reload mit den Werten aus der Config-Datei wieder überschrieben.

Ich suche gerade aber nach einer Möglichkeit, diese Config-Datei nur einmal innerhalb der laufenden Session zu laden und zur Laufzweit nicht ein weiteres mal zu laden.

Gibt es so eine möglichkeit?
 
Warum lädst du die Config nicht und überschreibst die Werte mit der in der Session?
 
Keine Ahnung, aber du kannst es schmutzig lösen.

if (empty($_SESSION['config'])) {
Ab hier fängt deine Config an
Und hier endet sie
$_SESSION['config']=1;
}

Damit wird sie nur einmal durchgeführt da bei jeder eventuellen Wiederholung die Variable einen Wert hätte und somit nicht leer wäre. ( Übersprungen wird )
 
Oder du entscheidest anhand des Session-Status, ob die diese Config laden willst... das dürfte die performanteste Lösung sein, hier musst du dann natürlich aufpassen, dass elementar wichtige Werte (z.B. DB-Zugang) in einer anderen File geladen werden.

das _once bei den beiden Befehlen heißt eigentlich nur: Wenn im selben Programmablauf dasselbe Script noch einmal eingebunden werden soll, überspringe es. Ein Seitenwechsel oder -reload ist ein neuer Programmdurchlauf.
Beispiel: unter include/Mail.php steht einer Mailer-Klasse zur Verfügung. 2-3 Programmierer arbeiten an dem Webprojekt an unterschiedlichen Modulen, jedes der Module soll Mails verschicken. Wenn man nicht sicher sein kann, dass die Mailer-Klasse bereits geladen ist, sagt man einfach require_once('...') und ist sich sicher, dass man a) die Klasse nutzen kann und b) die Klasse nicht doppelt definiert wird, weils vorher schon ein anderes Modul geladen hat.
 
Blackbenji schrieb:
Hallo,

ich habe geräde ein Verständnisproblem zum Thema Include_once/Require_once.

Innerhalb meiner index.php lade ich eine Config-Datei mit Variabeln.
Angenommen innerhalb der index.php verändere ich diese Werte, so werden diese nach dem Reload mit den Werten aus der Config-Datei wieder überschrieben.

Ich suche gerade aber nach einer Möglichkeit, diese Config-Datei nur einmal innerhalb der laufenden Session zu laden und zur Laufzweit nicht ein weiteres mal zu laden.

Gibt es so eine möglichkeit?

Vielleicht solltest du dir vor Augen halten: sobald du Output im Browserfenster siehst ist dein PHP Programm im Regelfall beendet. Alles danach ist nur ein erneutes Starten des Programms, dementsprechend gilt das _once natürlich nur für einen Durchlauf, im 2. hätte er die Config sonst gar nicht mehr.
Um zwischen den Durchläufen Daten zu tauschen gibt es nur eine Hand voll Möglichkeiten, nämlich a) die Infos ins HTML in irgendwelche Inputfelder zu packen und dann im nächsten Durchlauf aus Post/Get auszulesen oder b) das ganze in die Session packen oder c) das ganze in der Datenbank zwischenspeichern oder d) in eine Datei zwischenspeichern.

Wie du das jetzt löst ist dir überlassen, im Endeffekt wirst du _immer_ in irgendeiner Form schauen müssen, ob du die Config schon gezogen hast und wenn ja mit den gespeicherten Werten aus POST/GET/SESSION/DB/Datei überschreiben. Ich an deiner Stelle würde in der Configdatei ein Array mit den entsprechenden Werten setzen:

$aConfig = array('bla' => 3, 'blo' => 4, 'xyz' => 0.5);

Diese Werte lädst du über ein include in der Index.php, änderst sie wie du lustig bist und packst das ganze am Ende in die Session: $_SESSION['config'] = serialize($aConfig);
Oben nach dem Include machst du dann einfach ein:
if(isset($_SESSION['config'])) {
$aConfig = array_merge($aConfig, unserialize($_SESSION['config']));
}

Das überschreibt in deinem Configarray dann alle Werte aus der Include mit denen aus der Session. Das array_merge hat den Vorteil: wenn du in deiner Include einen neuen Configwert einträgst, bleibt der auch erhalten wenn noch ein alltes Configarray in der Session steht. Ansonsten solltest du nicht vergessen $_SESSION['config'] beim Abmelden entsprechend zu löschen, bzw die Session korrekt zu beenden.
 
Also zu deiner Frage von include_once und require_once:

Bei include_once wird die Datei die in das Script geladen wird nur 1. mal rein geladen genau so wie bei require_once, aber wenn z.B. die Datei nicht existiert oder ein Fehler ausgegeben wird, wird das Script bei require_once gestoppt und bei include_once läuft es einfach bis zum Ende weiter.

Mit freundlichen Grüßen

Falki
 
vergiss nicht wenn du objekte serialisiertst das du das interface Serializable implementieren musst! (Fall du noch mehr werte über einen scriot aufruf speichern muss)
 
Zurück
Oben