最近有一个小功能使用swoole扩展来开发,并没有使用框架,从零开始。这里采用类用似Symfony的目录结构:
. ├── bin ├── config ├── src ├── tests ├── vendor ├── phpunit.xml ├── composer.json ├── .gitignore ├── Dockerfile ├── LICENSE ├── phpunit.xml └── README.md
项目代码放置在src下面,测试代码则在tests里面,config目录存放配置文件,bin文件夹则是一些命令行工具,vendor目录则是composer安装第三方依赖库的目录。composer.json是借鉴k911/swoole-bundle,内容如下
{
"name": "llitllie/swoole-sample",
"type": "library",
"description": "Swoole Sample",
"keywords": [
"Swoole"
],
"license": "MIT",
"homepage": "https://github.com/llitllie/swoole-sample.git",
"authors": [{
"name": "llitllie",
"email": "[email protected]",
"homepage": "https://github.com/llitllie/swoole-sample.git"
}],
"require": {
"php": "^7.2",
"ext-swoole": "^4.3.4"
},
"require-dev": {
"phpunit/phpunit": "^8",
"phpstan/phpstan": "^0.11.8",
"friendsofphp/php-cs-fixer": "^2.15",
"swoole/ide-helper": "@dev"
},
"scripts": {
"static-analyse-src": [
"phpstan analyze src -l 7 --ansi"
],
"cs-analyse": [
"php-cs-fixer fix -v --dry-run --diff --stop-on-violation --ansi"
],
"analyse": [
"@static-analyse-src",
"@cs-analyse"
],
"test": [
"@analyse",
"@unit-tests"
],
"unit-tests": [
"phpunit tests --testdox --colors=always"
],
"fix": "php-cs-fixer fix -v --ansi"
},
"suggest": {
"ext-uv": "^0.2.4",
"ext-ev": "^1.0.6"
}
}
这里require里面指定了PHP版本>=7.2和Swoole扩展,composer安装时会自动检查。require-dev里面指定了单元测试工具phpunit、代码分析工具phpstan和代码风格检查php-cx-fixer。phpstan可以帮助分析代码,检测语法,在代码运行前发现问题。php-cx-fixer则可以帮忙格式化代码,保持代码统一风格。scripts里面定义了调用它们的命令,可以使用composer运行
$ ls -la vendor/bin/
total 4
drwxrwxr-x. 2 vagrant vagrant 69 Jul 1 07:24 .
drwxrwxr-x. 24 vagrant vagrant 4096 Jul 1 07:25 ..
lrwxrwxrwx. 1 vagrant vagrant 41 Jul 1 07:24 php-cs-fixer -> ../friendsofphp/php-cs-fixer/php-cs-fixer
lrwxrwxrwx. 1 vagrant vagrant 33 Jul 1 07:24 php-parse -> ../nikic/php-parser/bin/php-parse
lrwxrwxrwx. 1 vagrant vagrant 30 Jul 1 07:24 phpstan -> ../phpstan/phpstan/bin/phpstan
lrwxrwxrwx. 1 vagrant vagrant 26 Jul 1 07:24 phpunit -> ../phpunit/phpunit/phpunit
$ ./vendor/bin/phpunit --testdox tests
$ composer test
> phpstan analyze src -l 7 --ansi
7/8 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░] 87%
8/8 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
[OK] No errors
> php-cs-fixer fix -v --dry-run --diff --stop-on-violation --ansi
Loaded config default from "/home/ticket/.php_cs.dist".
Using cache file ".php_cs.cache".
SSSSSSSSSSS
Legend: ?-unknown, I-invalid file syntax, file ignored, S-Skipped, .-no changes, F-fixed, E-error
Checked all files in 0.070 seconds, 6.000 MB memory used
> phpunit tests --testdox --colors=always
PHPUnit 8.2.4 by Sebastian Bergmann and contributors.
Sim\Ticket\Node\Zookeeper
✓ Get id
Sim\Ticket\Number
✓ Load
✓ Get timestamp
✓ Get node id
✓ Generate
✓ Generate with zookeeper node
Sim\Zookeeper\Client
✓ Zookeeper
✓ Zookeeper extension
Time: 841 ms, Memory: 4.00 MB
OK (8 tests, 23 assertions)
phpuit.xml里面则是一些测试配置,可以在里面定义自动加载和变量
<?xml version="1.0" encoding="UTF-8"?>
<!-- https://phpunit.readthedocs.io/en/7.3/configuration.html -->
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/7.3/phpunit.xsd"
colors="true"
bootstrap="vendor/autoload.php"
>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">src/</directory>
</whitelist>
</filter>
<testsuites>
<testsuite name="Unit tests suite">
<directory>tests</directory>
</testsuite>
</testsuites>
<php>
<includePath>.</includePath>
<const name="SERVICE" value="192.168.33.1"/>
<env name="SERVICE" value="192.168.33.1"/>
</php>
</phpunit>
PHP Composer支持使用已有的代码作为模板,快速克隆创建一个新项目,方便重复使用。将代码保存到GitHub上面然后在packagist.org上面提交就可以了。使用composer create-project:
composer create-project llitllie/swoole-sample example dev-master
这里使用Docker来构建运行代码,Dockerfile内容如下
ARG PHP_TAG="7.2-cli-alpine3.9"
FROM php:$PHP_TAG
ENV COMPOSER_ALLOW_SUPERUSER 1
RUN set -ex \
&& apk update \
&& apk add --no-cache --virtual .build-deps curl gcc g++ make build-base autoconf \
&& apk add libstdc++ openssl-dev libffi-dev \
&& docker-php-ext-install sockets \
&& docker-php-source extract \
&& printf "yes\nyes\nno\nyes\nno\n" | pecl install swoole \
&& docker-php-ext-enable swoole \
&& docker-php-source delete \
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
&& apk del .build-deps \
&& rm -rf /tmp/*
WORKDIR /usr/src/app
COPY . ./
ARG COMPOSER_ARGS="install"
RUN composer ${COMPOSER_ARGS} --prefer-dist --ignore-platform-reqs --no-progress --no-suggest --no-scripts --ansi
EXPOSE 9501
CMD ["php", "bin/server.php"]
这里声明了swoole将会监听9501端口,默认运行bin目录下面的serverphp文件。使用pecl安装swoole会要求回答几个问题,比如是否启用socket/http2/mysqlnd等等,这里使用printf输出答案。构建,然后运行
docker build -t llitllie/swoole-project . docker run --name swoole -d -p 9501:9501 llitllie/swoole-project #docker run --name web -dit -p 9501:9501 --mount type=bind,source=/Users/vagrant/example,target=/opt/app llitllie/swoole-project /bin/sh
这样一个swoole项目模板算是好了,可以继续往composer文件里面添加需要的库或脚本;也可以继承在已经构建好的docker镜像基础上继续添加所需的软件,更改监听端口等等。
可以在Docker Cloud上面配置对应的git,并配置对应自动化构建规则,这样就可以方便的自动构建了。
