1. 文档
Xdebug - Debugger and Profiler Tool for PHP
Xdebug: Documentation » Installation
Xdebug: Documentation
GitHub - xdebug/xdebug: Xdebug — Step Debugger and Debugging Aid for PHP
https://pecl.php.net/package/xdebug
Xdebug: Support — Tailored Installation Instructions -- 提供了检测功能,从而可以给予一定的技术支持
2. 整理输出 2.1 环境
系统:Mac M1 环境:PHP 内置http server PHP版本:7.2 / 8.x
2.2 检查xdebug扩展 步骤 1. 检查PHP 扩展是否打开 xdebug
检查方式有二:【浏览器方式】与【命令行方式】具体不再详述,请自行查找。
浏览器方式
直接打印输出phpinfo();即可,搜索是否有xdebug
省略。
CLI方式
➜ ~ /usr/local/opt/php@7.2/bin/php -v
PHP 7.2.34 (cli) (built: Nov 24 2021 19:52:01) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.34, Copyright (c) 1999-2018, by Zend Technologies
➜ ~ /usr/local/opt/php@7.2/bin/php -m | grep xdebug
➜ ~
这是PHP7.2
➜ ~ php -v
PHP 8.1.1 (cli) (built: Dec 17 2021 22:38:05) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.1, Copyright (c) Zend Technologies
with Zend OPcache v8.1.1, Copyright (c), by Zend Technologies
➜ ~ php -m|grep xdebug
➜ ~
这是PHP 8.1
可以看到并没有安装【php -v 没有输出xdebug信息,以及php -m 也是没有xdebug】 那么接下来就是安装xdebug 2.3 安装xdebug扩展 安装之前,先根据自己的环境,进行xdebug安装环境要求的检测 xdebug会给出建议,安装步骤,然后按照步骤进行安装即可
Xdebug: Support — Tailored Installation Instructions
手动输出网址:
xdebug.org/wizard
将phpnfo输出的内容的html源码复制到上面的输入框中,然后点击 Analyse my phpinfo() output 查看返回的响应结果: 根据上面的说明进行操作安装即可。 Xdebug: Documentation » Installation
各个平台安装连接
这里是Mac M1 我们知道,m1采用的架构为arm, inter芯片采用的是x86架构设计. 使用 arch 命令就能知道本机的架构 可以看到安装的信息:
Build process completed successfully
Installing '/usr/local/Cellar/php/8.1.1/pecl/20210902/xdebug.so'
install ok: channel://pecl.php.net/xdebug-3.1.4
Extension xdebug enabled in php.ini
解读:
1. 成功构建完成
2. 安装成功,路径为/usr/local/Cellar/php/8.1.1/pecl/20210902/xdebug.so
3. 扩展配置也已写入php.ini并启用
FYI: 最新稳定版本
You can download the source of the latest stable release 3.1.4.
确认是否安装成功
➜ ~ php -v
PHP 8.1.1 (cli) (built: Dec 17 2021 22:38:05) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.1, Copyright (c) Zend Technologies
with Xdebug v3.1.4, Copyright (c) 2002-2022, by Derick Rethans
with Zend OPcache v8.1.1, Copyright (c), by Zend Technologies
➜ ~ php -m|grep xdebug
xdebug
➜ ~
可以看到,已经安装成功~~ 但是,这时候有个问题,公司项目是运行在PHP7.2版本,本地环境也必须保持一致,那么如何安装?
此时,第一个想法是弄清楚这个扩展到底是什么
另外,能否将so文件直接连接到php7.2的目录下,ini配置中,是否可行?
于是先是去寻找xdebug.so的目录,准备将其复制php7.2中,同时配置ini文件,
但是在这个过程中,发现了令我不解的事情
可以看到,php7.2下面也同时[可以看到时间是一样的]安装了xdebug扩展,
于是,先去验证,php7.2下,是否开启扩展xdebug
/usr/local/Cellar/php@7.2/7.2.34_4/pecl/20210902
/usr/local/opt/php@7.2/bin
➜ bin ./php -v
发现并没有xdebug
开始排查过程
1. 查看配置文件
ini文件中并没有xdebug
于是添加xdebug行
extension=xdebug
再次检查
./php -v
直接报错,如下信息
➜ bin ./php -v
PHP Warning: PHP Startup: Unable to load dynamic library 'xdebug' (tried: /usr/local/lib/php/pecl/20170718/xdebug (dlopen(/usr/local/lib/php/pecl/20170718/xdebug, 0x0009): tried: '/usr/local/lib/php/pecl/20170718/xdebug' (no such file), '/usr/local/lib/xdebug' (no such file), '/usr/lib/xdebug' (no such file)), /usr/local/lib/php/pecl/20170718/xdebug.so (dlopen(/usr/local/lib/php/pecl/20170718/xdebug.so, 0x0009): tried: '/usr/local/lib/php/pecl/20170718/xdebug.so' (no such file), '/usr/local/lib/xdebug.so' (no such file), '/usr/lib/xdebug.so' (no such file))) in Unknown on line 0
上面报错信息,大概意思就是在/usr/local/lib/php/pecl/20170718/下找不到xdebug,
其实根据上文的结果我们知道,xdebug在 /usr/local/lib/php/pecl/20210902
问题,PHP扩展的加载顺序和路径是什么?
以及整个流程/原理是什么样的?
见3.问题/补充
通过源代码方式安装
参考redis的安装:PHP - PECL - PHP扩展库 - 学习/实践_穿素白衫的少年的博客-CSDN博客_php扩展库
不过似乎还是没成功~
查看资料,以及实践验证
➜ lib cd php
➜ php ls
20210902 build pecl
➜ php
➜ pecl ls
20170718 20210902
➜ pecl pwd
/usr/local/lib/php/pecl
➜ pecl
这里之所以会有两个目录,因为本机安装了两个PHP版本
20170718用于PHP7.2
20210902用户PHP8.1
也是这个原因,导致了一个问题,在安装扩展的时候,没有指明为哪个PHP版本安装扩展,导致错乱,
尤其是在 1.先使用pecl install xdebug 之后 -- 默认使用的是PHP8.1,创建了20210902目录,并且存放xdebug.so文件,而且还会存放其他核心扩展文件。
2. 然后使用phpize为php7.2编译安装xdebug,
结果导致PHP 8.1/7.2 都不能正在运行脚本
执行php -v都报错~
解决办法,本来想着整个过程再来一遍覆盖安装,但是执行pecl install xdebug出现报错,
于是决定,删除20210902目录,以及注释掉 ;extension_dir = "/usr/local/lib/php/pecl/20210902"
重新执行php -v // PHP 8.1
依然报错,参见:
Linux - 软件编译安装 - 学习/实践_穿素白衫的少年的博客-CSDN博客
原因, 解决办法:TBD
但是PHP7.2 已经恢复如初,xdebug自然还是没有的。
➜ bin ./php -v
PHP 7.2.34 (cli) (built: Nov 24 2021 19:52:01) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.34, Copyright (c) 1999-2018, by Zend Technologies
➜ bin ./php -m | grep redis
redis
➜ bin
额外信息
通过查看php的目录信息,发现,opt/php*都是软连接,最终还是会走到../Cellar/php/*
➜ opt ls -al | grep php
lrwxr-xr-x 1 kumu admin 19 Dec 20 18:40 php -> ../Cellar/php/8.1.1
lrwxr-xr-x 1 kumu admin 26 Dec 24 17:34 php@7.2 -> ../Cellar/php@7.2/7.2.34_4
lrwxr-xr-x 1 kumu admin 19 Dec 20 18:40 php@8.1 -> ../Cellar/php/8.1.1
➜ opt
关于php8.1的报错
找到问题,ini文件第一行中居然有zend_extension="xdebug.so"
,注释掉,然后重新执行php -v, 可以看到已经正常~
➜ pecl pwd
/usr/local/Cellar/php/8.1.1/pecl
➜ pecl ls
20170718
➜ pecl php -v
PHP 8.1.1 (cli) (built: Dec 17 2021 22:38:05) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.1, Copyright (c) Zend Technologies
with Zend OPcache v8.1.1, Copyright (c), by Zend Technologies
➜ pecl
重新来一遍 1. sudo pecl install xdebug -- 然后检查php.ini文件,通常是okay的,这是php8.x 2. 复制20210902目录下的xdebug.so到20170718目录下,同时添加 执行 权限。 但是PHP7.2执行 php -v一样有问题,报错信息,还是上面的问题。
➜ pecl /usr/local/opt/php@7.2/bin/php -v
PHP Warning: Failed loading Zend extension 'xdebug' (tried: /usr/local/lib/php/pecl/20170718/xdebug (dlopen(/usr/local/lib/php/pecl/20170718/xdebug, 0x0009): tried: '/usr/local/lib/php/pecl/20170718/xdebug' (no such file), '/usr/local/lib/xdebug' (no such file), '/usr/lib/xdebug' (no such file)), /usr/local/lib/php/pecl/20170718/xdebug.so (dlopen(/usr/local/lib/php/pecl/20170718/xdebug.so, 0x0009): symbol not found in flat namespace '__smart_string_alloc')) in Unknown on line 0
Warning: Failed loading Zend extension 'xdebug' (tried: /usr/local/lib/php/pecl/20170718/xdebug (dlopen(/usr/local/lib/php/pecl/20170718/xdebug, 0x0009): tried: '/usr/local/lib/php/pecl/20170718/xdebug' (no such file), '/usr/local/lib/xdebug' (no such file), '/usr/lib/xdebug' (no such file)), /usr/local/lib/php/pecl/20170718/xdebug.so (dlopen(/usr/local/lib/php/pecl/20170718/xdebug.so, 0x0009): symbol not found in flat namespace '__smart_string_alloc')) in Unknown on line 0
PHP 7.2.34 (cli) (built: Nov 24 2021 19:52:01) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.34, Copyright (c) 1999-2018, by Zend Technologies
➜ pecl
原因TBD: 猜测针对不同PHP版本安装的xdebug扩展,不能相互通用~ 解决办法: 使用php7.2的pecl重新xdebug,如下: 使用php 7.2,重新php -v 可以看到已经成功~ FYI PHP7.2的php.ini文件的配置
extension_dir = "/usr/local/lib/php/pecl/20170718" zend_extension=xdebug
PHP8.1的php.ini文件的配置
extension_dir = "/usr/local/lib/php/pecl/20210902" zend_extension=xdebug
Note 这里的踩坑经验告诉我
1. xdebug属于zend extension,与php extension有区别,-- xdebug跟opcache是一个级别的,跟pdo, redis扩展不同。
2. 当安装有不同的php版本,不论使用pecl还是phpize都要执行为哪个php版本安装扩展。
|