PHP – Xdebug安装 – 学习/实践

PHP – Xdebug安装 – 学习/实践

1.应用场景

主要用于学习和安装xdebug扩展。

2.学习/操作

PHP - Xdebug安装 - 学习/实践

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方式

PHP - Xdebug安装 - 学习/实践

➜  ~ /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

PHP - Xdebug安装 - 学习/实践

PHP - Xdebug安装 - 学习/实践

将phpnfo输出的内容的html源码复制到上面的输入框中,然后点击 Analyse my phpinfo() output

查看返回的响应结果:

PHP - Xdebug安装 - 学习/实践

根据上面的说明进行操作安装即可。

Xdebug: Documentation » Installation

各个平台安装连接

  • Linux with a package manager such as aptyum, or something else.
  • Linux without an Xdebug package with PECL.
  • macOSX with homebrew, through PECL.
  • Windows, with help from a wizard.
  • Unix-like operating systems, from source.

这里是Mac M1

PHP - Xdebug安装 - 学习/实践

我们知道,m1采用的架构为arm, inter芯片采用的是x86架构设计.

使用 arch 命令就能知道本机的架构

PHP - Xdebug安装 - 学习/实践

PHP - Xdebug安装 - 学习/实践

PHP - Xdebug安装 - 学习/实践

可以看到安装的信息:

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文件,

但是在这个过程中,发现了令我不解的事情

PHP - Xdebug安装 - 学习/实践

可以看到,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

PHP - Xdebug安装 - 学习/实践

发现并没有xdebug

开始排查过程

1. 查看配置文件

ini文件中并没有xdebug

于是添加xdebug行

extension=xdebug

PHP - 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

PHP - Xdebug安装 - 学习/实践

上面报错信息,大概意思就是在/usr/local/lib/php/pecl/20170718/下找不到xdebug,

其实根据上文的结果我们知道,xdebug在 /usr/local/lib/php/pecl/20210902

PHP - Xdebug安装 - 学习/实践

问题,PHP扩展的加载顺序和路径是什么?

以及整个流程/原理是什么样的?

3.问题/补充

通过源代码方式安装

参考redis的安装:PHP – PECL – PHP扩展库 – 学习/实践_穿素白衫的少年的博客-CSDN博客_php扩展库

PHP - Xdebug安装 - 学习/实践

不过似乎还是没成功~

查看资料,以及实践验证

➜  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 - Xdebug安装 - 学习/实践

,注释掉,然后重新执行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目录下,同时添加 执行 权限。

PHP - Xdebug安装 - 学习/实践

但是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 - Xdebug安装 - 学习/实践

PHP - Xdebug安装 - 学习/实践

使用php 7.2,重新php -v

PHP - Xdebug安装 - 学习/实践

可以看到已经成功~

PHP - Xdebug安装 - 学习/实践

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版本安装扩展。

3.问题/补充

1. PHP的可执行程序/命令

/usr/local/opt/php@7.2/bin

PHP - Xdebug安装 - 学习/实践

/usr/local/opt/php/bin — php8.1

PHP - Xdebug安装 - 学习/实践

2. 问题:PHP扩展的加载顺序和路径是什么?以及整个流程/原理是什么样的?

通过当加载不存在的扩展时以及是否配置了extension_dir,就知道了加载顺序,

加载xdebug,但是没有配置extension_dir

➜  20210902 php -v

PHP Warning:  Failed loading Zend extension 'xdebug' (tried: /usr/local/Cellar/php/8.1.1/lib/php/20210902/xdebug (dlopen(/usr/local/Cellar/php/8.1.1/lib/php/20210902/xdebug, 0x0009): tried: '/usr/local/Cellar/php/8.1.1/lib/php/20210902/xdebug' (no such file), '/usr/local/lib/xdebug' (no such file), '/usr/lib/xdebug' (no such file)), /usr/local/Cellar/php/8.1.1/lib/php/20210902/xdebug.so (dlopen(/usr/local/Cellar/php/8.1.1/lib/php/20210902/xdebug.so, 0x0009): tried: '/usr/local/Cellar/php/8.1.1/lib/php/20210902/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

加载xdebug,但是配置了extension_dir,但是路径下没有xdebug.so文件

➜  20170718 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): 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

由上可以知道,如果在php.ini文件中加载某个扩展,比如xdebug,

如下配置代码,顺序方面没有要求,而且可以从php 7.2开始可以省略.so后缀,以及双引号使用不使用均可。

均是合法

zend_extension="xdebug.so"

zend_extension="xdebug"

zend_extension=xdebug.so

zend_extension=xdebug

如果,php.ini文件中配置了extension_dir, 则会优先查找extension_dir配置的路径,

如果没有配置,则优先查找/usr/local/Cellar/php/8.1.1/lib/php/20210902

20210902这个应该是PHP APi Version / Zend Module Api No

PHP - Xdebug安装 - 学习/实践

然后查找/usr/local/lib/xdebug

/usr/lib/xdebug

应该是一旦找到,就不在查找下去,优先匹配原则 — 带验证。

至于整个流程/原理是什么样的?

简单说:

将下载 extname 的源代码,编译,并将 extname.so 安装到 extension_dir 中。

然后 extname.so 就可以通过 php.ini 加载了。

— 这个过程中,应该是涉及到了不同PHP版本的信息,所以,不同版本PHP的pecl安装的扩展so文件,不能相互使用。

4.参考

参见文档列表

后续补充

                       

点击阅读全文

上一篇 2023年 6月 15日 am10:12
下一篇 2023年 6月 15日 am10:14