目录
[TOC]
PHP74 + Docker + Alpine 安装 Yasd 调试
参考
Xdebug 不支持 swoole, 安装 Yasd 拓展,替换 Xdebug。
编译准备
#更新最新镜像源列表
$ apk update
下载源码
$ apk add git
$ cd /tmp
$ git clone https://github.com/swoole/yasd.git
注意:当前版本为
v0.3.9
如果需要指定版本,
- -b 后面写上指定 版本标签, 即 tag,
-b v0.3.9
- --depth 表示克隆深度, 1 表示只克隆最新的版本. 因为如果项目迭代的版本很多, 克隆会很慢
若报错,可参阅 《附录 - git 克隆代码报错》
编译拓展 yasd.so
安装依赖
apk --update add autoconf gcc g++ make zlib-dev boost-dev
编译
cd yasd/
phpize --clean && \
phpize && \
./configure && \
make clean && \
make && \
make install
若报错,可参阅 《附录 - 编译错误》
复制 yasd.so 拓展
因为 Docker 容器的内容,一旦 Docker 容器被删除,里面的内容也将被删除。所以我们复制 yasd.so 拓展,以后就不再需要重新编译了。
如果想要在 Dockerfile 编译镜像的时候直接编译 Yasd, 请自行摸索。
查找 yasd.so 路径
$ find / -name 'yasd.so'
/usr/local/lib/php/extensions/no-debug-non-zts-20190902/yasd.so
/tmp/yasd/modules/yasd.so
复制 /usr/local/lib/php/extensions/no-debug-non-zts-20190902/yasd.so
到你自己的目录。
如果你想用复制出来出来的yasd.so
, 那么你把它挂载到 Docker
假如你挂载到 /usr/local/lib/php/extensions/outer/Yasd-v0.3.9/
那么则修改PHP配置文件
zend_extension = /usr/local/lib/php/extensions/outer/Yasd-v0.3.9/yasd.so
PHP 配置
查找 yasd.so 路径
$ find / -name 'yasd.so'
/usr/local/lib/php/extensions/no-debug-non-zts-20190902/yasd.so
/tmp/yasd/modules/yasd.so
查找PHP配置文件 php.ini 路径
$ php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/etc/php
Loaded Configuration File => /usr/local/etc/php/php.ini
或者
$ find / -name 'php.ini'
/usr/local/etc/php/php.ini
编辑配置文件
编译安装到系统成功后, 需要在 php.ini 中加入一行 extension=yasd.so 来启用yasd扩展
$ vim /usr/local/etc/php/php.ini
在末尾加上
[yasd]
extension=yasd.so
; yasd.debug_mode = cmd
yasd.debug_mode = remote
; yasd.remote_host = 127.0.0.1
; Docker 配置,不然无法连接 IDE
yasd.remote_host = host.docker.internal
; 注意这里选用跟 xdebug 默认端口一样,而不是 9000
; 因为 9000 可能被 php-fpm 占用
yasd.remote_port = 9003
yasd.log_level = 0
查看拓展版本
$ php --ri yasd
Vs Code 配置
打开 运行与调试
(左侧边栏) -> 打开 "launch.json"
(一个齿轮图标)
如果不会的,自行搜索 xdebug 配置,一样的。
加入以下配置
{
"name": "Listen for Yasd",
"type": "php",
"request": "launch",
"port": 9003,
"pathMappings": {
"/var/www/xxx": "${workspaceFolder}" // 这里路径 /var/www/xxx, 改成自己代码挂载的 docker 目录。注意不是改 ${workspaceFolder}!
}
}
调试
启动调试
- 选择 Listen for Yasd 按 F5 启动调试
- 设置断点(代码行号左边单击一下)
- 发送http请求
如果是后台脚本,则在 php 加上 -e 选项,例如
$ php -e index.php home hello
调试报错
[yasd] recv command error, Connection reset by peer
远程调试 web php 代码完全跑不动,查看错误日志
�[33m[yasd] recv command error, Connection reset by peer�[0m
解决:
端口被占用,修改配置 remote_port
为别的未被占用的端口,如 9003
[yasd] Connect IDE failed (Connection refused), please check that the IDE is in a listening state
远程调试,连接不到 VS CODE。查看错误日志
�[33m[yasd] Connect IDE failed (Connection refused), please check that the IDE is in a listening state�[0m
解决:
传统的 127.0.0.1
不适用 Docker,修改配置 remote_host
yasd.remote_host = host.docker.internal
附录
git 克隆代码报错
fatal: unable to access 'https://github.com/swoole/yasd.git/': OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
当你通过HTTPS访问Git远程仓库的时候,如果服务器的SSL证书未经过第三方机构(例如:CA)签署,那么Git就会报错。原因是因为未知的没有签署过的证书意味着可能存在很大的风险。
解决:
# Git 禁用 SSL 认证
$ git config --global http.sslVerify false
编译错误
如果没有安装依赖,编译过程中可能会出现下面的错误。
Cannot find autoconf.
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
解决:
apk add autoconf
no acceptable C compiler found in $PATH
解决:
apk --update add gcc make g++ zlib-dev
lib boost not found.
解决:
apk add boost-dev