最近有一个小功能使用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,并配置对应自动化构建规则,这样就可以方便的自动构建了。