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安装环境要求的检测

xdebug会给出建议,安装步骤,然后按照步骤进行安装即可

Xdebug: Support — Tailored Installation Instructions

手动输出网址:

xdebug.org/wizard

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

查看返回的响应结果:

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

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

我们知道,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.参考

参见文档列表

后续补充

...

PHP - Xdebug安装 - 学习/实践相关推荐

  1. PHP - Xdebug调试 - 学习/实践

    1.应用场景 主要用于学习和使用xdebug进行项目的调试,包括本地项目或者远程项目.基于vscode或者phpstorm编辑器或IDE,目的就是为了解决开发中的问题,快速调试找到问题,解决问题. 2 ...

  2. PHP 8 - 学习/实践

    1.应用场景 了解关注体验最新PHP 8的版本特性,以便在项目中使用. 2.学习/操作 1. 文档阅读 PHP: Hypertext Preprocessor PHP 8 确认支持 JIT - OSC ...

  3. 安装gym库_强化学习Gym库学习实践(一)

    最近看了一篇研究方向相关的文章,介绍了一种DQN的应用,感觉还挺新鲜的.想着把这篇文章复现出来,就开始学习强化学习的相关知识,作为一名小白,这一路走的可是真的十分艰难(我太菜了啊!) 看了莫烦Pyth ...

  4. Greenplum学习实践-【安装部署】-2、 5.10集群部署

    Greenplum学习实践-[安装部署]-2. 5.10集群部署 第 1 章** 环境说明 1.1 官方文档 Greenplum官方安装说明: https://gpdb.docs.pivotal.io ...

  5. 【Python爬虫学习实践】基于BeautifulSoup的网站解析及数据可视化

    在上一次的学习实践中,我们以Tencent职位信息网站为例,介绍了在爬虫中如何分析待解析的网站结构,同时也说明了利用Xpath和lxml解析网站的一般化流程.在本节的实践中,我们将以中国天气网为例,并 ...

  6. .NET Core on K8S学习实践系列文章索引(持续更新)

    近期在学习Kubernetes,基于之前做笔记的习惯,已经写了一部分文章,因此给自己立一个2019年的flag:完成这个<.NET Core on K8S学习实践>系列文章!这个系列会持续 ...

  7. Nagios学习实践系列

    其实上篇Nagios学习实践系列--基本安装篇只是安装了Nagios基本组件,虽然能够打开主页,但是如果不配置相关配置文件文件,那么左边菜单很多页面都打不开,相当于只是一个空壳子.接下来,我们来学习研 ...

  8. 大数据时代的全能日志分析专家--Splunk安装与实践

    大数据时代的全能日志分析专家 --Splunk安装与实践 0.背  景 随着大家对网络安全意识的提高,企业网管理人员,必须对IT基础设置进行监控及安全事件的管理,管理数据的数量和种类非常巨大,那么就需 ...

  9. Nagios学习实践系列——配置研究[监控当前服务器]

    其实上篇Nagios学习实践系列--基本安装篇只是安装了Nagios基本组件,虽然能够打开主页,但是如果不配置相关配置文件文件,那么左边菜单很多页面都打不开,相当于只是一个空壳子.接下来,我们来学习研 ...

最新文章

  1. 北京交大计算机学院王浩业,双胞胎双双“吹”进北交大
  2. A02 创建实验环境快照
  3. 安装python3.7.0的步骤_python 3.7.0 安装配置方法图文教程
  4. 三位数除以两位数怎么算竖式_青岛版三年级上册数学5.6三位数除以一位数(最高位商后有余数)微课知识点精讲+练习...
  5. 基础知识(十)C++常用函数.txt
  6. 零基础物联网开发,踩坑无数,得到这份宝典 | 原力计划
  7. 嵌入式linux驱动开发答辩问题,嵌入式Linux驱动工程师/BSP开发工程师面试笔试题集锦...
  8. java计算机毕业设计商品货物信息管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  9. 小程序解析富文本(支持视频,支持微信编辑器,支持135编辑器富文本样式)
  10. php 汉字拼音字典排序,按拼音排序的小技巧
  11. 春天不健脾养胃 也要等什么时候
  12. Java蓝桥模拟战——特殊的数字:153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。
  13. canvas制作圆型印章
  14. ADC采集数据求平均
  15. IO流 | IO流的应用举例
  16. 《会计学》账户与复式记账笔记的思维导图
  17. ACW3302表达式求值
  18. 高数————思维导图(上岸必备)(积分部分)
  19. 网络经济与企业管理【四】之企业组织管理
  20. QT 中用代码执行命令行清空Linux系统垃圾箱Trash

热门文章

  1. 至 我的大学 (国庆假期随笔作业)
  2. pc项目,通过左侧导航树展示右侧router
  3. iOS/swift之常用正则
  4. 2018年百度算法大盘点
  5. 获取nacos配置中心文件值_Java 静态(static)方法读取 Nacos 配置中心
  6. 【云原生 • DevOps】一文掌握持续集成工具 Jenkins
  7. 计算机专业的硕士犯罪,中国刑事警察学院计算机犯罪侦查系介绍
  8. LeetCode-Python-1046. 最后一块石头的重量
  9. 美版htc 蝴蝶安装小米桌面导致wifi error 连不上
  10. 易点易动设备管理系统帮助水泥厂实现智能设备巡检