首页 > 解决方案 > php中有什么方法可以在加载之前检查扩展是否是zend_extension

问题描述

在使用 php 脚本将扩展名添加到 php.ini 文件之前,我想检查扩展名是否是 zend 扩展名,以避免在我将其作为普通扩展名加载时发生的错误。

标签: php

解决方案


有趣的问题,它仍然需要和回答。

您可以检查 PHP 扩展(Linux 上的共享对象文件

  1. 是一个zend扩展 并且
  2. 它可以从CLI SAPI [doc] 中的特定 PHP 版本加载。

这是一个断言可以加载已编译的 .so 文件的 shell 示例:

php -n -dzend_extension="$PWD/modules/xdebug.so" \
    -r 'echo implode("\n", get_loaded_extensions(true)), "\n";' \
  | LC_ALL=C grep -i xdebug

./modules/xdebug.so当文件没有导致 PHP 扩展名为“xdebug”(不区分大小写)时,这个(复杂的)shell 命令返回非零值。

如果您在 PHP 脚本中需要它,您可以使用带有out-parameter的[doc][doc] 。passthru() exec() $result_code


例如在扩展目录[ ini ]中安装文件之前进行测试并在ini中激活它。

在标准错误中,您还会在加载失败时找到诊断消息。

例如,使用 PHP 5.6 为 PHP 5.3 加载一个 zend 扩展:

$ php5.6 -n -dzend_extension="$PWD/modules/xdebug.so" \
         -r 'echo implode("\n", get_loaded_extensions(true)), "\n";' \
    | LC_ALL=C grep -i xdebug
Failed loading /home/hakre/install-php5.3/xdebug-2.2.7/modules/xdebug.so: 
/home/hakre/install-php5.3/xdebug-2.2.7/modules/xdebug.so: undefined symbol: php_body_write
$ echo $?
1

一些备注:

-n开关减少了配置的副作用,它完全禁用了标准 ini 加载,让您使用默认值编译(您可能也希望在没有的情况下运行它,它可能会显示更多的 zend 扩展)。

[ posix]用于当前工作目录,最好在命令行 ( ) 上将绝对路径传递给指令,因为如果在您想要的地方加载失败,PHP 也会在不同的目录中查看相对路径在没有任何更多查找的情况下,首先使用该二进制扩展文件失败(或成功)。$PWD zend_extension-dzend_extension=<extension-path>

这应该提供足够的指导来涵盖升级现有扩展等情况。它不会减轻您的负担,例如在迁移情况下,比较扩展 ini 配置中的更改。只是说。


推荐阅读