dl

(PHP 4, PHP 5)

dlЗагружает PHP расширение во время выполнения

Описание

bool dl ( string $library )

Загружает PHP расширение заданное аргументом library.

Чтобы проверить, что заданное расширение уже загружено, используйте функцию extension_loaded(). Эта функция работает как для встроенных расширений, так и для динамически загруженных (т.е. загруженных как через php.ini, так и через dl()).

Внимание

Эта функция удалена из некоторых SAPI в PHP 5.3.

Список параметров

library

Этот аргумент содержит только имя файла расширения, которое требуется загрузить. Это имя зависит от платформы. Например, расширение sockets (если скомпилировано, как загружаемый модуль, а не модуль по умолчанию!) будет называться sockets.so на Unix платформах, и php_sockets.dll в Windows среде.

Директория, из которой расширение должно быть загружено также зависит от платформы:

Windows - Если явно не задано в php.ini, расширение будет грузиться из C:\php4\extensions\ (PHP 4) или C:\php5\ (PHP 5) по умолчанию.

Unix - Если явно не задано в php.ini, директория по умолчанию зависит от

  • PHP собран с настройкой --enable-debug или без нее
  • PHP собран с (экспериментально) ZTS (Zend Thread Safety) поддержкой или нет
  • текущего внутреннего номера ZEND_MODULE_API_NO (номер внутреннего модуля Zend API, который как правило является датой значительного изменения API модуля, например 20010901)
Принимая во внимание вышесказанное, получаем следующие умолчания для директории расширения <install-dir>/lib/php/extensions/ <debug-or-not>-<zts-or-not>-ZEND_MODULE_API_NO, непример /usr/local/php/lib/php/extensions/debug-non-zts-20010901 или /usr/local/php/lib/php/extensions/no-debug-zts-20010901.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Если механизм загрузки модулей недоступен или отключен (либо значением off настройки enable_dl, либо включен безопасный режим в php.ini), будет выдана ошибка E_ERROR, и выполнение будет остановлено. Если dl() не сможет загрузить заданную библиотеку, то в дополнение к FALSE будет выдано сообщение E_WARNING.

Примеры

Пример #1 Примеры использования dl()

<?php
// Пример загрузки расширения, основываясь на ОС
if (!extension_loaded('sqlite')) {
    if (
strtoupper(substr(PHP_OS03)) === 'WIN') {
        
dl('php_sqlite.dll');
    } else {
        
dl('sqlite.so');
    }
}

// Или на константе PHP_SHLIB_SUFFIX (доступна с PHP 4.3.0)
if (!extension_loaded('sqlite')) {
    
$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' '';
    
dl($prefix 'sqlite.' PHP_SHLIB_SUFFIX);
}
?>

Список изменений

Версия Описание
5.3.0 dl() выключен в некоторых SAPI в связи с нестабильностью работы. Из SAPI, поддерживающих dl(), остались только CLI и Embed. Используйте вместо dl Директивы загрузки расширений.

Примечания

Замечание:

dl() не поддерживается в PHP собранных с поддержкой ZTS. Используйте вместо dl Директивы загрузки расширений.

Замечание:

dl() чувствительна к регистру на Unix платформах.

Замечание: Эта функция недоступна в безопасном режиме.

Смотрите также

Коментарии

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 $loadedExtensionssizeof$loadedExtensions ) - ];
 
 
//lastly, we return the extension name
 
return $thisExtName;

}
//end dl_local()

?>
2003-10-18 07:12:50
http://php5.kiev.ua/manual/ru/function.dl.html
<?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 $loadedExtensionssizeof$loadedExtensions ) - ];
 
 
//lastly, we return the extension name
 
return $thisExtName;

}
//end dl_local()

?>
2005-12-06 13:13:44
http://php5.kiev.ua/manual/ru/function.dl.html
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');

?>
2009-01-29 02:34:18
http://php5.kiev.ua/manual/ru/function.dl.html
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.
2016-09-29 15:17:39
http://php5.kiev.ua/manual/ru/function.dl.html

    Поддержать сайт на родительском проекте КГБ