PHP 5.5.15 is released

dl

(PHP 4, PHP 5)

dlCarga una extensión de PHP en tiempo de ejecución

Descripción

bool dl ( string $library )

Carga la extensión PHP dada por el parámetro library.

Utilice la función extension_loaded() para comprobar si la extensión ya está cargada o no. Funciona tanto para extensiones ya integradas en PHP o para extensiones que se han cargado dinámicamente (ya sea a través de php.ini o dl()).

Advertencia

Esta función ha sido eliminada en algunos módulos SAPI en PHP 5.3.

Parámetros

library

Este parámetro es solamente el fichero de la extensión a cargar el cual depende del sistema operativo. Por ejemplo, la extensión sockets (si se compila como librería, no como parte de PHP) Se llamará sockets.so en sistemas Unix mientras que en Windows se llamará php_sockets.dll.

El directorio desde donde la extensión será cargada también depende del sistema operativo:

En Windows - a no ser que se defina explicitamente en php.ini, la extensión será cargada por defecto desde C:\php4\extensions\ (PHP4) o C:\php5\ en (PHP 5).

Unix - a no ser que se defina en php.ini, el directorio de extensiones por defecto depende de

  • Si PHP fué compilado con la opción --enable-debug o no
  • Si PHP fué comiplado con soporte (experimental) ZTS (Zend Thread Safety) o no
  • El módulo interno actual ZEND_MODULE_API_NO (Número interno del API Zend, que es básicamente la fecha en que se produjo un cambio de versión, p.ej. 20010901)
Teniendo esto en cuenta el directorio por defecto será <install-dir>/lib/php/extensions/ <debug-or-not>-<zts-or-not>-ZEND_MODULE_API_NO, p.ej. /usr/local/php/lib/php/extensions/debug-non-zts-20010901 o /usr/local/php/lib/php/extensions/no-debug-zts-20010901.

Valores devueltos

Devuelve TRUE en caso de éxito o FALSE en caso de error. Si la funcionalidad de cargar módulos no está disponible o ha sido deshabilitada (ya sea activando enable_dl off o habilitando el safe mode en php.ini) Se producirá un E_ERROR y se parará la ejecucción de PHP. Si dl() falló porque la librería especificacda no pudo cargarse a demás de FALSE se producirá un mensaje E_WARNING.

Ejemplos

Ejemplo #1 Ejemplos de dl()

<?php
// En este ejemplo se carga una extensión u otra dependiendo del sistema operativo
if (!extension_loaded('sqlite')) {
    if (
strtoupper(substr(PHP_OS03)) === 'WIN') {
        
dl('php_sqlite.dll');
    } else {
        
dl('sqlite.so');
    }
}

// O si la constante PHP_SHLIB_SUFFIX está disponible desde PHP 4.3.0
if (!extension_loaded('sqlite')) {
    
$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' '';
    
dl($prefix 'sqlite.' PHP_SHLIB_SUFFIX);
}
?>

Historial de cambios

Versión Descripción
5.3.0 dl() está desactivado en algunos módulos SAPI por problemas de estabilidad. Los únicos modulos SAPI que permiten dl() son: CLI, CGI and Embed. En su lugar usar las directivas Directivas de carga de extensiones

Notas

Nota:

dl() no se soporta cuando PHP es compilado con soporte ZTS. Use en su lugar Directivas de carga de extensiones instead.

Nota:

dl() es sensible a mayúsculas en sistemas Unix.

Nota: Esta función no está disponible cuando PHP está corriendo en safe mode.

Ver también

add a note add a note

User Contributed Notes 5 notes

up
2
shaunspiller at spammenot-gmail dot com
5 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
1
endofyourself at yahoo dot com
10 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()

?>
up
0
Anonymous
3 years ago
this function errors out as the dl() cannot take the absolute path..."Warning: dl() [function.dl]: Temporary module name should contain only filename in /home/..."
up
0
mag_2000 at front dot ru
8 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
-1
fabrizim at owlwatch dot com
1 year ago
As noted in the documentation:

Changelog 5.3: dl() is now disabled in some SAPIs due to stability issues. The only SAPIs that allow dl() are CLI and Embed. Use the Extension Loading Directives instead.

If using PEAR libraries that try to load extensions, like Image_Transform which will try to load ImageMagik, and the "enable_dl" directive is set to 1 in your php.ini, you may end up with a hard to find error (white screen of death).

One "solution" is to change the enable_dl directive to 0 in the php.ini. It may have adverse affects if you are using php on command line that requires the "dl" function, but I think in most cases its okay.
To Top