Signatur
Beschreibung
dl() ermöglicht das dynamische Laden einer PHP-Erweiterung während der Laufzeit eines Skripts. Der Dateiname der Erweiterung wird übergeben, und PHP lädt die entsprechende Shared-Library-Datei (.so unter Unix/Linux, .dll unter Windows) aus dem durch die INI-Direktive extension_dir festgelegten Verzeichnis.
Die Funktion ist primär für CLI-Skripte und Testszenarien gedacht, in denen man eine Erweiterung nachladen möchte, ohne den Webserver neu starten zu müssen. In einer Web-Server-Umgebung (z. B. Apache mod_php) ist dl() aus Sicherheitsgründen oft deaktiviert oder steht nicht zur Verfügung.
Seit PHP 5.3.0 ist dl() in vielen SAPI-Umgebungen (z. B. FastCGI) deaktiviert. Es wird empfohlen, Erweiterungen stattdessen dauerhaft über php.ini mit der extension=-Direktive zu laden. Ab PHP 8 ist dl() in einigen eingebetteten SAPIs komplett nicht verfügbar.
Bevor die Funktion aufgerufen wird, sollte geprüft werden, ob die Erweiterung nicht bereits geladen ist, um doppeltes Laden zu verhindern, was zu einem Fehler führen kann.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $extension_filename Pflicht | string | Der Dateiname der zu ladenden Erweiterung, ohne Pfad. Zum Beispiel php_curl.dll (Windows) oder curl.so (Unix). Das Verzeichnis wird durch die INI-Direktive extension_dir bestimmt. |
Rückgabewert
true zurück, wenn die Erweiterung erfolgreich geladen wurde, andernfalls false. Im Fehlerfall wird zusätzlich eine entsprechende Fehlermeldung ausgegeben.Beispiele
Erweiterung nur laden, wenn noch nicht vorhanden
<?php
// Sicherstellen, dass curl noch nicht geladen ist, bevor dl() aufgerufen wird
if (!extension_loaded('curl')) {
$ext = (PHP_OS_FAMILY === 'Windows') ? 'php_curl.dll' : 'curl.so';
if (dl($ext)) {
echo "Erweiterung 'curl' wurde erfolgreich geladen.\n";
} else {
echo "Fehler: Erweiterung konnte nicht geladen werden.\n";
}
} else {
echo "Erweiterung 'curl' ist bereits geladen.\n";
}
CLI-Skript: Erweiterung zur Laufzeit nachladen
<?php
// Typischer CLI-Anwendungsfall: eigene Erweiterung laden
$extensionFile = 'meine_erweiterung.so';
if (!extension_loaded('meine_erweiterung')) {
if (!dl($extensionFile)) {
fwrite(STDERR, "Konnte Erweiterung '{$extensionFile}' nicht laden.\n");
exit(1);
}
echo "Erweiterung geladen: " . $extensionFile . "\n";
}
// Ab hier steht die Erweiterung zur Verfügung
echo "Verfügbare Erweiterungen: " . implode(', ', get_loaded_extensions()) . "\n";
// Wichtig · Fallstricke
Sicherheit: Das Übergeben von Benutzereingaben an dl() ist extrem gefährlich und kann zur Ausführung beliebigen nativen Codes führen. Der Dateiname sollte niemals aus nicht vertrauenswürdigen Quellen stammen.
Verfügbarkeit: In vielen Server-SAPIs (mod_php, FPM, FastCGI) ist dl() standardmäßig deaktiviert und wirft einen Fehler. Die Funktion steht hauptsächlich im CLI-SAPI zuverlässig zur Verfügung. Über disable_functions in der php.ini kann sie explizit gesperrt werden.
Doppeltes Laden: Der Versuch, eine bereits geladene Erweiterung erneut zu laden, führt zu einem Fehler. Immer zuerst extension_loaded() prüfen.
Deprecation: Die Verwendung von dl() wird generell nicht empfohlen. Der bevorzugte Weg ist, Erweiterungen über die php.ini-Direktive extension= dauerhaft zu konfigurieren.