Signatur
Beschreibung
virtual() ist eine Apache-spezifische Funktion, die eine interne Apache-Unteranfrage für eine gegebene URI durchführt. Dies entspricht dem Apache-SSI-Befehl <!--#include virtual="..." -->. Die Funktion ermöglicht es, andere PHP-Skripte, CGI-Skripte oder statische Dateien serverseitig einzubinden, als ob der Browser diese direkt angefragt hätte.
Wichtig: virtual() ist ausschließlich verfügbar, wenn PHP als Apache-Modul (mod_php) betrieben wird. Bei anderen Serverkonfigurationen (z. B. PHP-FPM, FastCGI, CLI) steht die Funktion nicht zur Verfügung.
Im Gegensatz zu include oder require wird die angegebene Datei durch den Apache-Mechanismus verarbeitet – d. h. sie durchläuft den vollständigen Apache-Request-Zyklus inklusive aller konfigurierten Handler und Module. Dies macht virtual() nützlich, wenn z. B. eine Datei verarbeitet werden soll, die durch einen anderen Handler (z. B. Perl-CGI) bedient wird.
Da die Ausgabe der Unteranfrage direkt in den Ausgabepuffer geschrieben wird, sollte virtual() nur eingesetzt werden, wenn der Apache-Kontext zwingend erforderlich ist. Für reine PHP-Einbindungen sind include oder require performanter und portabler.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $filename Pflicht | string | Der URI-Pfad der Datei oder des Skripts, das als Apache-Unteranfrage ausgeführt werden soll. Der Pfad muss relativ zum Dokumentenstamm (DocumentRoot) des Apache-Servers angegeben werden, z. B. /includes/header.php. |
Rückgabewert
true zurück, wenn die Unteranfrage erfolgreich durchgeführt wurde. Bei einem Fehler (z. B. Datei nicht gefunden oder keine Apache-Umgebung) wird false zurückgegeben.Beispiele
Einbinden eines Apache-seitigen Header-Skripts
<?php
// Bindet /common/header.php über eine Apache-Unteranfrage ein
if (!virtual('/common/header.php')) {
echo '<!-- Header konnte nicht geladen werden -->';
}
echo '<p>Hauptinhalt der Seite</p>';
virtual('/common/footer.php');
?>
Einbinden eines CGI-Skripts über virtual()
<?php
// Ein Perl-CGI-Skript wird durch Apache verarbeitet und ausgegeben
// Dies funktioniert nur, wenn der Apache-Handler für .cgi konfiguriert ist
virtual('/cgi-bin/stats.cgi');
?>
// Wichtig · Fallstricke
Plattformabhängigkeit: virtual() funktioniert ausschließlich im Apache-Modul-Modus (mod_php). Unter PHP-FPM, CLI oder anderen SAPIs ist die Funktion nicht verfügbar und wirft einen fatalen Fehler. Portabler Code sollte daher function_exists('virtual') prüfen, bevor die Funktion aufgerufen wird.
Sicherheit: Benutzereingaben dürfen niemals direkt als Argument an virtual() übergeben werden, da dies zu Path-Traversal-Angriffen führen kann (z. B. /../../etc/passwd). Der Pfad muss immer serverseitig validiert und auf erlaubte Werte beschränkt werden.
Veraltete Praxis: In modernen PHP-Anwendungen wird virtual() kaum noch verwendet. Für die Einbindung von PHP-Dateien sind include oder require vorzuziehen; für HTTP-Anfragen eignet sich cURL besser.