CakeFest 2024: The Official CakePHP Conference

dl

(PHP 4, PHP 5, PHP 7, PHP 8)

dlCarica un estensione PHP a runtime

Descrizione

dl(string $library): bool

Carica l'estensione PHP fornita dal parametro library.

Si può utilizzare extension_loaded() per testare se un dato modulo è già disponibile oppure no. Questo funziona sia sulle estensioni integrate sia su quelle caricate dinamicamente (tramite php.ini oppure dl()).

Avviso

Questa funzione è stata rimossa dalla maggior parte dei SAPI in PHP 5.3.0, ed è stata rimossa da PHP-FPM in PHP 7.0.0.

Elenco dei parametri

library

Il parametro indica soltanto il nome del file dell' estensione da caricare che può dipendere dalla piattaforma utilizzata. Ad esempio, l'estensione sockets (se compilata come modulo condiviso, non il default!) sulle piattaforme Unix si chiamerebbe sockets.so, mentre su quelle Windows si chiamerebbe php_sockets.dll.

La directory da cui viene caricata l'estensione dipende dalla piattaforma:

Windows - Se non viene impostato esplicitamente nel php.ini, di default l'estensione viene caricata da C:\php5\.

Unix - Se non viene impostato esplicitamente nel php.ini, di default la directory dell'estensione dipende da

  • se PHP è stato compilato con --enable-debug o meno
  • se PHP è stato compilato con il supporto (sperimentale) a ZTS (Zend Thread Safety) o meno
  • la costante interna ZEND_MODULE_API_NO (numero API del modulo interno Zend, che è fondamentalmente la data in cui è avvenuta un'importante modifica all'API del modulo, ad esempio 20010901)
Tenendo conto di quanto sopra, la directory viene quindi impostata di default a <install-dir>/lib/php/extensions/ <debug-or-not>-<zts-or-not>-ZEND_MODULE_API_NO, per esempio /usr/local/php/lib/php/extensions/debug-non-zts-20010901 oppure /usr/local/php/lib/php/extensions/no-debug-zts-20010901.

Valori restituiti

Restituisce true in caso di successo, false in caso di fallimento. Se la funzionalità di carico dei moduli non è disponibile oppure è stata disabilitata (disattivando enable_dl nel php.ini), viene generato un E_ERROR e viene bloccata l'esecuzione. Se dl() fallisce perché non riesce a caricare la libreria indicata, oltre a restituire false, viene emesso un messaggio E_WARNING.

Esempi

Example #1 Esempi di dl()

<?php
// Esempio di caricamento di un'estensione in base al sistema operativo
if (!extension_loaded('sqlite')) {
if (
strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
dl('php_sqlite.dll');
} else {
dl('sqlite.so');
}
}

// O usando la costante PHP_SHLIB_SUFFIX
if (!extension_loaded('sqlite')) {
$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
dl($prefix . 'sqlite.' . PHP_SHLIB_SUFFIX);
}
?>

Note

Nota:

dl() non è supportata quando PHP è compilato con il supporto ZTS. Utilizzare invece le Direttive sul Caricamento delle Estensioni.

Nota:

dl() è sensibile alle maiuscole sulle piattaforme Unix.

Vedere anche:

add a note

User Contributed Notes 4 notes

up
13
shaunspiller at spammenot-gmail dot com
15 years ago
dl is awkward because the filename format is OS-dependent and because it can complain if the extension is already loaded. This wrapper function fixes that:

<?php

function load_lib($n, $f = null) {
return
extension_loaded($n) or dl(((PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '') . ($f ? $f : $n) . '.' . PHP_SHLIB_SUFFIX);
}

?>

Examples:

<?php

// ensure we have SSL and MySQL support
load_lib('openssl');
load_lib('mysql');

// a rare few extensions have a different filename to their extension name, such as the image (gd) library, so we specify them like this:
load_lib('gd', 'gd2');

?>
up
-2
mag_2000 at front dot ru
18 years ago
<?php

function dl_local( $extensionFile ) {
//make sure that we are ABLE to load libraries
if( !(bool)ini_get( "enable_dl" ) || (bool)ini_get( "safe_mode" ) ) {
die(
"dh_local(): Loading extensions is not permitted.\n" );
}

//check to make sure the file exists
if( !file_exists( $extensionFile ) ) {
die(
"dl_local(): File '$extensionFile' does not exist.\n" );
}

//check the file permissions
if( !is_executable( $extensionFile ) ) {
die(
"dl_local(): File '$extensionFile' is not executable.\n" );
}

//we figure out the path
$currentDir = getcwd() . "/";
$currentExtPath = ini_get( "extension_dir" );
$subDirs = preg_match_all( "/\//" , $currentExtPath , $matches );
unset(
$matches );

//lets make sure we extracted a valid extension path
if( !(bool)$subDirs ) {
die(
"dl_local(): Could not determine a valid extension path [extension_dir].\n" );
}

$extPathLastChar = strlen( $currentExtPath ) - 1;

if(
$extPathLastChar == strrpos( $currentExtPath , "/" ) ) {
$subDirs--;
}

$backDirStr = "";
for(
$i = 1; $i <= $subDirs; $i++ ) {
$backDirStr .= "..";
if(
$i != $subDirs ) {
$backDirStr .= "/";
}
}

//construct the final path to load
$finalExtPath = $backDirStr . $currentDir . $extensionFile;

//now we execute dl() to actually load the module
if( !dl( $finalExtPath ) ) {
die();
}

//if the module was loaded correctly, we must bow grab the module name
$loadedExtensions = get_loaded_extensions();
$thisExtName = $loadedExtensions[ sizeof( $loadedExtensions ) - 1 ];

//lastly, we return the extension name
return $thisExtName;

}
//end dl_local()

?>
up
-4
anrdaemon at freemail dot ru
7 years ago
Like with eval(), the only correct way to use dl() is to not use it.
Test if a function(s) you intend to use are available.
If not, complain to the user or implement a workaround.
Not to mention dl() issues in a multithreading environment.
up
-4
endofyourself at yahoo dot com
20 years ago
If you need to load an extension from the CURRENT local directory because you do not have privelages to place the extension in your servers PHP extensions directory, this function i wrote may be of use to you

<?php
/*
Function: dl_local()
Reference: http://us2.php.net/manual/en/function.dl.php
Author: Brendon Crawford <endofyourself |AT| yahoo>
Usage: dl_local( "mylib.so" );
Returns: Extension Name (NOT the extension filename however)
NOTE:
This function can be used when you need to load a PHP extension (module,shared object,etc..),
but you do not have sufficient privelages to place the extension in the proper directory where it can be loaded. This function
will load the extension from the CURRENT WORKING DIRECTORY only.
If you need to see which functions are available within a certain extension,
use "get_extension_funcs()". Documentation for this can be found at
"http://us2.php.net/manual/en/function.get-extension-funcs.php".
*/

function dl_local( $extensionFile ) {
//make sure that we are ABLE to load libraries
if( !(bool)ini_get( "enable_dl" ) || (bool)ini_get( "safe_mode" ) ) {
die(
"dh_local(): Loading extensions is not permitted.\n" );
}

//check to make sure the file exists
if( !file_exists( $extensionFile ) ) {
die(
"dl_local(): File '$extensionFile' does not exist.\n" );
}

//check the file permissions
if( !is_executable( $extensionFile ) ) {
die(
"dl_local(): File '$extensionFile' is not executable.\n" );
}

//we figure out the path
$currentDir = getcwd() . "/";
$currentExtPath = ini_get( "extension_dir" );
$subDirs = preg_match_all( "/\//" , $currentExtPath , $matches );
unset(
$matches );

//lets make sure we extracted a valid extension path
if( !(bool)$subDirs ) {
die(
"dl_local(): Could not determine a valid extension path [extension_dir].\n" );
}

$extPathLastChar = strlen( $currentExtPath ) - 1;

if(
$extPathLastChar == strrpos( $currentExtPath , "/" ) ) {
$subDirs--;
}

$backDirStr = "";
for(
$i = 1; $i <= $subDirs; $i++ ) {
$backDirStr .= "..";
if(
$i != $subDirs ) {
$backDirStr .= "/";
}
}

//construct the final path to load
$finalExtPath = $backDirStr . $currentDir . $extensionFile;

//now we execute dl() to actually load the module
if( !dl( $finalExtPath ) ) {
die();
}

//if the module was loaded correctly, we must bow grab the module name
$loadedExtensions = get_loaded_extensions();
$thisExtName = $loadedExtensions[ sizeof( $loadedExtensions ) - 1 ];

//lastly, we return the extension name
return $thisExtName;

}
//end dl_local()

?>
To Top