我有多个版本的 PHP,使用
brew
。当我想在 PHP 7.4 到 PHP 8.1 之间切换时,我使用此命令
brew unlink [email protected] && brew link [email protected]
当我下载 Xdebug for PHP 8.1 时,我使用
pecl install xdebug
到目前为止,它会安装Xdebug的最新版本。所以如果我写
pecl list
我明白了
Package Version State
imagick 3.7.0 stable
xdebug 3.2.2 stable
当我打开
/usr/local/etc/php/8.1/php.ini
我得到
zend_extension="xdebug.so"
到现在为止都还好。
现在问题是当我想为我的 PHP 7.4 安装较低版本时(因为较新版本的 Xdebug 与 PHP 7.4 不兼容)。所以根据 this page 我最多应该下载 PHP 7 的 xdebug-3.1。
所以我将使用
切换到 PHP 7brew unlink [email protected] && brew link [email protected]
然后我使用此命令下载与 PHP 7.4 兼容的 Xdebug 版本
pecl install xdebug-3.1.6
它会很好地下载,但是每当我使用 PHP 时我都会遇到这个问题,例如
php -v
Failed loading /usr/local/opt/[email protected]/pecl/20210902/xdebug.so: dlopen(/usr/local/opt/[email protected]/pecl/20210902/xdebug.so, 0x0009): symbol not found in flat namespace (_instanceof_function_slow)
我猜是因为它不知道 Xdebug 的路径。
如果我打开
/usr/local/etc/php/7.4/php.ini
我得到
zend_extension="xdebug.so"
我尝试将PHP 7中的php.ini中的路径更改为
/usr/local/opt/[email protected]/pecl/20210902/xdebug.so
,因为该路径中有Xdebug文件,但问题仍然存在。
如何解决这个问题?
您正在加载为错误的 PHP 版本编译的
xdebug.so
。对于 PHP 7.4,您应该查看是否有 .../pecl/20190902/xdebug.so
文件。然后检查您的活动 php.ini 以查看扩展从哪里加载,请参阅 extension_dir
php.ini 指令。
详情:
“加载失败”错误告诉我两件事。 首先,加载的.so文件依赖于导出的函数
_instanceof_function_slow
。这是
PHP-8 分支中存在的内容,但 PHP 7.4 分支中不存在。 第二个是路径
/usr/local/opt/[email protected]/pecl/20210902/xdebug.so
中的API版本。
20210902
API 版本对应于 PHP 8.1,而 PHP 7.4 使用 20190902。我无法在官方网站上找到列表(除了查看源代码),但这里有一个列出版本的link供参考。
API版本 | |
---|---|
20190902 | |
20210902 |
/usr/local/opt/[email protected]/pecl
==
/usr/local/opt/[email protected]/pecl
)和/或 php.ini 需要调整。要调试,我建议如下:
pecl list
/usr/local/opt/[email protected]/pecl
/usr/local/opt/[email protected]/pecl
的内容是否有更多API版本文件夹(寻找20190902
和20210902
)通过 php -i | grep extension_dir
检查活动扩展文件夹检查是否有任何对 pecl 文件夹的引用
php -i | grep -i pecl
zend_extension="/usr/local/opt/[email protected]/pecl/20190902/xdebug.so"