如何检查PECL扩展是否存在?

Pro*_*ica 8 php pecl

如果安装了PECL扩展,我如何从PHP代码?

我希望在没有安装扩展时优雅地处理这种情况.

bit*_*ing 7

我认为通常的方法是使用扩展加载.

if (!extension_loaded('gd')) {
    // If you want to try load the extension at runtime, use this code:
    if (!dl('gd.so')) {
        exit;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 好.我不是很喜欢那个. (2认同)

Pro*_*ica 5

get_loaded_extensions适合账单.

使用这样:

$ext_loaded = in_array('redis', get_loaded_extensions(), true);
Run Code Online (Sandbox Code Playgroud)

  • @Ascherer,是的,我猜*class_exists*更优雅,因为它不关心实现细节.我想我会在我的生产代码中使用它.不过,知道如何检查扩展是很好的.我认为get_extension_funcs不起作用,因为redis只公开一个类,没有函数. (2认同)

Asc*_*rer 2

结合不同的方式。您可以只检查类是否存在,甚至是函数:class_existsfunction_existsget_extension_funcs

<?php
if( class_exists( '\Memcached' ) ) {
    // Memcached class is installed
}

// I cant think of an example for `function_exists`, but same idea as above

if( get_extension_funcs( 'memcached' ) === false ) {
    // Memcached isn't installed
}
Run Code Online (Sandbox Code Playgroud)

您也可以变得超级复杂,并使用ReflectionExtension. 当你构造它时,它会抛出一个ReflectionException. 如果它没有抛出异常,您可以测试有关扩展的其他信息(例如版本)。

<?php
try {
    $extension = new \ReflectionExtension( 'memcached' );
} catch( \ReflectionException $e ) {
    // Extension Not loaded
}

if( $extension->getVersion() < 2 ) {
    // Extension is at least version 2
} else {
    // Extension is only version 1
}
Run Code Online (Sandbox Code Playgroud)