最近有一个小功能使用swoole扩展来开发,并没有使用框架,从零开始。这里采用类用似Symfony的目录结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 | . ├── 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,内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | { "name" : "llitllie/swoole-sample" , "type" : "library" , "description" : "Swoole Sample" , "keywords" : [ "Swoole" ], "license" : "MIT" , "authors" : [{ "name" : "llitllie" , "email" : "xxx@yyy.zzz" , }], "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运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | $ 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里面则是一些测试配置,可以在里面定义自动加载和变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <? xml version = "1.0" encoding = "UTF-8" ?> 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:
1 | composer create-project llitllie /swoole-sample example dev-master |
这里使用Docker来构建运行代码,Dockerfile内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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输出答案。构建,然后运行
1 2 3 | 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,并配置对应自动化构建规则,这样就可以方便的自动构建了。