一、说明
项目需要,还在多版本php开发,本文主要讲述PhpStorm开发环境下的PHPUnit配合Docker镜像,本地调试代码。
二、准备
注:
php7.x使用redis5.x、yaf3.x、phpunit6.5.14
php5.6使用redis3.x、yaf2.x、phpunit5.7.27
三、制作镜像
- PhpStorm运行的是docker镜像而非容器,所以这里需要制作一个扩展完整,配置正确的镜像。docker操作这里不详细赘述,直接上Dockerfile
FROM php:7.3-fpm
RUN pecl install yaf && docker-php-ext-enable yaf && echo '[yaf]\nyaf.use_namespace=On\nyaf.use_spl_autoload=On\nyaf.environ=develop'>>/usr/local/etc/php/conf.d/docker-php-ext-yaf.ini
RUN pecl install redis && docker-php-ext-enable redis
RUN pecl install xdebug && docker-php-ext-enable xdebug
RUN docker-php-ext-install pdo && docker-php-ext-enable pdo
RUN docker-php-ext-install pdo_mysql && docker-php-ext-enable pdo_mysql
php7.x版本安装扩展较为容易,可直接使用pecl安装,php5.6版本稍微复杂一点点
FROM php:5.6-fpm
COPY ./yaf-2.3.5.tgz /tmp/yaf.tgz
RUN ls /tmp
RUN mkdir -p /tmp/yaf && tar -xf /tmp/yaf.tgz -C /tmp/yaf --strip-components=1 \
&& rm /tmp/yaf.tgz && docker-php-ext-configure /tmp/yaf --enable-yaf && docker-php-ext-install /tmp/yaf \
&& rm -r /tmp/yaf && echo '[yaf]\nyaf.use_namespace=On\nyaf.use_spl_autoload=On\nyaf.environ=develop'>>/usr/local/etc/php/conf.d/docker-php-ext-yaf.ini
COPY ./redis-3.1.6.tgz /tmp/redis.tgz
RUN ls /tmp
RUN mkdir -p /tmp/redis && tar -xf /tmp/redis.tgz -C /tmp/redis --strip-components=1 \
&& rm /tmp/redis.tgz && docker-php-ext-configure /tmp/redis --enable-redis && docker-php-ext-install /tmp/redis \
&& rm -r /tmp/redis
RUN docker-php-ext-install mysql && docker-php-ext-enable mysql
- 生成镜像
docker build -t php73:v2.0 .
几点区别:
- php5.6版本需要将下载好的扩展文件复制到镜像中安装
- mysql只需要安装mysql扩展即可(根据项目代码而定)
四、配置PhpStorm
-
基本配置,新增cli,新增项目代码的挂载地址以及phpunit.phar挂载地址
image.png -
单元测试配置,指定.phar文件路径为容器内文件路径。
image.png
五、安装redis容器
docker run -d -p 6379:6379 \
-v ${REDIS_CONF_FILE}:/etc/redis.conf
-v ${REDIS_DATA_DIR}:/data/
--ip 172.17.0.2 \
--name redis redis:5.0
redis也可简单安装,建议conf文件与data文件一起挂载出来,固定ip比较好配置
六、完成
支持编辑器断点调试了 XD。

image.png
注意几点
- php连接redis需要填容器内ip地址,这里是 172.17.0.2
- docker基础知识与phpunit基本设置需要自行补充
- 各种扩展根据项目需要
- 生手碰到较多的问题大概率是redis连接失败的问题,除了ip正确,查看redis容器与镜像是否在同一个网络内是关键:
docker network ls
docker inspect redis

