PHP74 + Docker + Alpine 安装 Yasd 调试

目录

[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}!
    }
}

调试

启动调试

  1. 选择 Listen for Yasd 按 F5 启动调试
  2. 设置断点(代码行号左边单击一下)
  3. 发送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就会报错。原因是因为未知的没有签署过的证书意味着可能存在很大的风险。

参阅:ssl 认证失败的最有效地解决方案

解决:

# 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容