禅道二次开发
前言
- 禅道版本:18.12
- php版本:7.4
- nginx版本:1.18.0
- mysql版本:5.7
注意:禅道的二次开发不能直接从官方镜像仓库拉取代码(坑!!!)
到以下链接直接下载安装包(源码)

环境准备
这里采用 docker 的方式进行开发环境的搭建。
拉取一下镜像到本地(docker 已封,需设置代理)
- php:7.4-fpm-buster
- nginx:1.18.0
- bitnami/mysql:5.7

制作fpm增强镜像
解释下,php:7.4-fpm-buster是基础镜像,没有安装任何php拓展,禅道的开发是需要前置拓展)
# 启动一个fpm容器
$ docker run -d -it --name php74_fpm php:7.4-fpm-buster
# 进入容器
$ docker exec -it php74_fpm /bin/bash

下载php源码包
使用docker-php-source的extract命令将源代码导入到容器的/usr/src/php下面。
(待会用到)
$ docker-php-source extract

安装一些依赖库和工具
# 更新下源
$ apt-get update
# 安装依赖和工具
$ apt-get -y install wget libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev libc-client-dev libkrb5-dev libzip-dev git vim
准备下软件包下载目录
在根目录下新建一个packages目录
$ cd /
# 新建目录
$ mkdir packages
# 进入该目录
$ cd /packages
安装mysql拓展
# 安装
$ docker-php-ext-install pdo_mysql
# 启用
$ docker-php-ext-enable pdo_mysql

安装bcmath拓展
# 安装
$ docker-php-ext-install bcmath
# 启用
$ docker-php-ext-enable bcmath

安装gd拓展
# 先设置一些配置参数
$ docker-php-ext-configure gd --with-jpeg=/usr/include --with-freetype=/usr/include/
# 安装
$ docker-php-ext-install gd
# 启用
$ docker-php-ext-enable gd

安装redis拓展
# 下载安装包
$ wget http://pecl.php.net/get/redis-4.1.0.tgz
# 解压
$ tar -xzvf redis-4.1.0.tgz
# 进入安装包目录
$ cd redis-4.1.0
# 配置并编译安装
$ /usr/local/bin/phpize
$ ./configure --with-php-config=/usr/local/bin/php-config
$ make && make install
# 回到原来的软件包下载目录
$ cd ..
# 启用拓展
$ docker-php-ext-enable redis

安装imap拓展(非必需)
# 先设置一些配置参数
$ docker-php-ext-configure imap --with-kerberos --with-imap-ssl
# 安装
$ docker-php-ext-install imap
# 启用
$ docker-php-ext-enable imap

安装psr拓展(非必需,建议安装)
# 使用pecl进行安装
$ pecl install psr

安装xdebug拓展(调试使用)
打开https://xdebug.org/wizard这个网站

获取当前 php 的信息。
# 指定后拷贝其输出值
$ php -i
粘贴到该输出框


输出结果如下


# 下载安装包
$ wget https://xdebug.org/files/xdebug-3.1.6.tgz
# 解压安装包
$ tar -xvzf xdebug-3.1.6.tgz
# 进入该目录
$ cd xdebug-3.1.6
# 配置并安装
$ phpize
$ ./configure
$ make
$ cp modules/xdebug.so /usr/local/lib/php/extensions/no-debug-non-zts-20190902/

配置(重要!!!)
使用生产环境的配置文件模板复制出php.ini文件。
$ cd /usr/local/etc/php/
$ cp php.ini-production php.ini
关闭错误提示
display_errors = Off
$ vi /usr/local/etc/php/php.ini

设置错误级别
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

设置错误日志
error_log = /var/log/php_errors.log

设置时区
date.timezone = Asia/Shanghai

通过执行一段代码测试时区设置和错误设置是否正确。
$ php -r "echo \"Now is \". date(\"Y-m-d H:i:s\"). \"\n\";bad_fun_call();"

启用xdebug、bcmath、psr拓展
因为安装的是 xdebug3 ,默认端口为 9003,另外**xdebug.client_host **更换为你本机的 ip。(建议使用 mac地址 锁定ip)
extension = bcmath.so
extension = psr.so
[xdebug]
; xdebug3.x
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.client_host = "172.33.5.54"
xdebug.client_port = 9003

保存容器为镜像(最后一步)
退出容器
$ docker commit php74_fpm php:7.4-fpm-buster-enhance

启动mysql镜像
这里我设置的超管密码为 123456
其他配置请自行查看https://hub.docker.com/r/bitnami/mysql
# 创建个存储卷
$ docker volume create mysql_data__5_7
# 启动
$ docker run -d --name mysql_5_7 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql_data__5_7:/bitnami/mysql/data \
bitnami/mysql:5.7
启动fpm增强镜像
/Users/zaki/work/php-env/74/www目录自行替换为自己的,这个目录是放源代码的
# 启动
$ docker run -tid --name php-env-php74-fpm \
-p 9000:9000 \
-v /Users/zaki/work/php-env/74/www:/www \
--link mysql_5_7:mysql \
php:7.4-fpm-buster-enhance
启动nginx镜像
新建 nginx 配置,放置禅道源代码

my-nginx.conf配置
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html/zentaopms/www;
index index.php index.html index.htm default.php default.htm default.html;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www/zentaopms/www$fastcgi_script_name;
include fastcgi_params;
}
}
# 启动
$ docker run -tid --name php-env-php74-nginx \
-p 80:80 \
-v /Users/zaki/work/php-env/74/www:/usr/share/nginx/html:ro \
-v /Users/zaki/work/php-env/74/nginx-conf/conf.d:/etc/nginx/conf.d:ro \
--link php-env-php74-fpm:php \
nginx:1.18.0
最后访问禅道地址http://127.0.0.1/index.php进行配置,最后可看到此页面







安装完,会产生这些文件(不要提交到 git)

开发调试
这是使用的开发工具为PhpStorm
核心原理和 java 的远程调试是一样的





配置代理(关键)

服务器地址映射(关键)

本地源码位置和服务器(容器里面)的位置

开启监听

浏览器安装个xdebug插件


sessionkey保持和PhpStorm DBGp代理的IDE键一致


这时候你点击网页的按钮就会进入断点(先在指定代码位置打好断点)
这时候你们会问,如果是接口访问呢?如何进断点?
打开 postman ,右边找到 Cookies 。

点击 Cookies ,填入 XDEBUG_SESSION=PHPSTORM,之后即可调起 PhpStorm 的调试功能

在 Headers 中新增{KEY:Cookie,VALUE:XDEBUG_SESSION=PHPSTORM}

然后发起 send 请求,由 PhpStorm 捕捉,成功进入断点。
注意: 若是还无法成功捕捉断点,可以在 Headers 里新增XDEBUG_SESSION_START的值尝试一下

其中,XDEBUG_SESSION_START 的值在 PHPstorm 开启调试的右上角 Debugger 中可以找到。

原理图
单机调试原理示意图

多机调试原理示意图

文章评论