• PHP - Xdebug安装 - 学习/实践


    1.应用场景

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

    2.学习/操作

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

    3.问题/补充

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

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

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

    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

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

    /usr/lib/xdebug

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

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

    简单说:

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

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

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

    4.参考

    参见文档列表

    后续补充

    ...

  • 相关阅读:
    Springboot整合Druid:数据库密码加密的实现
    第三届机器学习、云计算与智能挖掘国际会议(MLCCIM 2024)
    Hive进阶函数之【分割函数(split)、行转列函数(explode)、lateral view】
    【双目视觉】 立体匹配算法原理之“代价空间与聚合、视差计算”
    差分进化算法解析:Scala实现详细指南及其在优化问题中的应用
    recovery模式差分(增量)升级小结
    【Node.js】Express
    vue环境搭建
    Android四大组件之BroadcastReceiver(四)
    自组织是管理者和成员的双向奔赴
  • 原文地址:https://blog.csdn.net/william_n/article/details/124968041