php - php中有什么方法可以在加载之前检查扩展是否是zend_extension
问题描述
在使用 php 脚本将扩展名添加到 php.ini 文件之前,我想检查扩展名是否是 zend 扩展名,以避免在我将其作为普通扩展名加载时发生的错误。
解决方案
有趣的问题,它仍然需要和回答。
您可以检查 PHP 扩展(Linux 上的共享对象文件)
- 是一个zend扩展 并且
- 它可以从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 配置中的更改。只是说。
推荐阅读
- r - 通过合并 R 中的两个现有列来创建一个新列
- node.js - 在js中循环创建不同的对象
- django - 关于postgreSql的安装问题
- excel - 基于日期、类别和计划或实际的 TEXTJOIN 数组公式
- javascript - 进行 AJAX 调用以将 JSON 数据加载到 sessionStorage
- javascript - React jsx数组组件在状态更改时不会重新渲染
- python - 树莓派 LED 亮度计算
- reactjs - 缓存的外部图像组件在路由更改时闪烁
- node.js - 是否可以从浏览器访问智能手机的蓝牙?
- reactjs - 如何使用 IIS 授权部署 ASP.NET Core / React 应用程序?