title: swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解一下呗~
description: 阅读 sowft 框架源码, swoft 第一步, 搞定环境小伙伴刚接触 swoft 的时候会感觉 压力有点大, 更直观的说法是 难. 开发组是不赞成 难 这个说法的, swoft 的代码都是 php 实现的, 而 php 又是 世界上最好的语言, swoft 的代码阅读起来是很轻松的.
开发组会用 源码解读系列 博客, 深入解读 swoft. 我们相信, 这会成为一段轻松之旅.
swoft 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解一下呗~
本篇内容速读:
-
环境的锅我不背: 学习和使用 swoft 需要预备这些 基础知识.
-
docker: 搞定 swoft 环境
-
docker-compose: 搞定更多服务
-
使用 composer 进行包管理: 开发组的日常
环境的锅我不背
这个好难真心不是 swoft 的锅, 这是环境的锅. swoft 官方文档已经提供了相当详细的 说明, 如果一直无法成功:
-
推荐 swoole 的运行环境是 linux, linux 的一些基本概念和操作是否掌握了
-
swoole 作为 php 扩展的形式工作的, php 扩展的一些基本概念和安装是否掌握
-
swoft 使用 composer 来进行包管理, composer 的一些基本概念和操作是否掌握了
-
使用 swoft 来开发后端应用, 服务器的一些基础知识(tcp/ip四层网络协议, ip端口域名等)是否掌握了
学习和使用 swoft 需要预备这些 基础知识.
docker
那么, 怎么快速配好开发环境呢? 答案是 docker !
docker 要上手比想象中的要容易, 开发组提供了 , 镜像详情在 中, 摘录其中配置 swoole 的部分:
# Swoole extensionRUN wget https://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz -O swoole.tar.gz \ && mkdir -p swoole \ && tar -xf swoole.tar.gz -C swoole --strip-components=1 \ && rm swoole.tar.gz \ && ( \ cd swoole \ && phpize \ && ./configure --enable-async-redis --enable-mysqlnd --enable-openssl --enable-http2 \ && make -j$(nproc) \ && make install \ ) \ && rm -r swoole \ && docker-php-ext-enable swoole
如果你还没有掌握 swoole 运行所需环境的配置, 可以参考这个 dockerfile 文件的源码.
当然, 为了开发方便, 我们可能需要构建不同的环境, 比如指定不同的 php 版本, 使用不同的 swoole 版本, 设置中文镜像加速等, 也可以参考 下的 dockerfile
FROM php:7.2.5-cli-alpine3.7# FROM php:7.1.13-cli-alpine3.4LABEL maintainer="1252409767@qq.com"RUN echo -e "http://mirrors.ustc.edu.cn/alpine/v3.7/main\nhttp://mirrors.ustc.edu.cn/alpine/v3.7/community" > /etc/apk/repositories && \ apk updateRUN apk add tzdata && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezoneRUN apk add $PHPIZE_DEPS# docker-php-extRUN docker-php-ext-install bcmath mysqli pcntl pdo_mysql# pecl# http://pecl.php.net/package/mongodbRUN curl -O http://pecl.php.net/get/redis-4.0.2.tgz && \ pecl install redis-4.0.2.tgz && \ docker-php-ext-enable redisRUN curl -O http://pecl.php.net/get/mongodb-1.4.3.tgz && \ apk add openssl-dev && \ pecl install mongodb-1.4.3.tgz && \ docker-php-ext-enable mongodb# swooleRUN curl -O https://gitee.com/swoole/swoole/repository/archive/v4.0.3.zip && unzip v4.0.3.zip && \ apk add linux-headers openssl-dev nghttp2-dev hiredis-dev && \ cd swoole && \ phpize && \ ./configure --enable-coroutine --enable-openssl --enable-async-redis --enable-http2 && make && make install && \ docker-php-ext-enable swoole && \ rm -rf v4.0.3.zip swoole
ps: 这里的 dockerfile 使用 alpine linux 做基础镜像, 大小不到 10m, 非常简单纯粹的一个 linux 发行版, 推荐尝试. 使用了国内源和gitee进行加速.
docker-compose
到这里我们已经有了 swoft 的运行环境了, 根据 章节中的说明, 执行 php bin/swoft start
就可以将 swoft demo 运行起来了.
如果我们还需要更多服务, mysql呀, redis呀, 甚至前置 nginx, docker-compose 可以帮助到我们, docker-compose 用来把我们每一个 docker 服务编排(管理)起来, 举个例子 :
nginx: build: context: nginx dockerfile: Dockerfile volumes: - ../:/var/www - ./logs/nginx/:/var/log/nginx links: - swoft ports: - "80:80" - "443:443" swoft: # container_name: swoft image: swoft/swoft volumes: - ../:/var/www links: - mysql - redis ports: - "8001:8001" - "9501:9501" working_dir: /var/www/swoole/swoft stdin_open: true command: php -a tty: true - redis mysql: build: context: mysql dockerfile: Dockerfile volumes: - ./data/mysql:/var/lib/mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root redis: build: context: redis dockerfile: Dockerfile volumes: - ./data/redis:/data - ./logs/redis:/var/log/redis ports: - "6379:6379"
这里我们启动了 nginx / swoft / mysql / redis 4个服务:
-
links
: 服务之间的关系, 比如 swoft 会使用到 mysql 和 redis, 那么 swoft 中就可以使用mysql
作为host
访问到 myql 服务 -
ports
: 端口映射 -
volumes
: 文件挂载
了解这些标签都有什么作用, 就能理解和使用 docker-compose 了
使用 composer 进行包管理
使用 git clone
下载了 swoft 的源码后, 还需要使用 composer install
安装 swoft 框架. 在此之前, swoft 进行了 , 让框架进一步的解耦和易用. 普通用户很少会修改 composer install
安装的 swoft 框架, 但是开发组会频繁更新 swoft 框架, 然后在 swoft demo 项目中验证, 那是如何实现的呢?
答案是使用 composer 提供的 repositories
功能, 直接引入本带代码库:
{ "name": "swoft/swoft", "type": "project", "keywords": [ "php", "swoole", "swoft" ], "description": "Modern High performance AOP and Coroutine PHP Framework, base on Swoole 2", "license": "Apache-2.0", "require": { "php": ">=7.0", "ext-swoole": ">=2.1", "swoft/framework": "^1.0", "swoft/rpc": "^1.0", "swoft/rpc-server": "^1.0", "swoft/rpc-client": "^1.0", "swoft/http-server": "^1.0", "swoft/http-client": "^1.0", "swoft/websocket-server": "^1.0", "swoft/task": "^1.0", "swoft/http-message": "^1.0", "swoft/view": "^1.0", "swoft/db": "^1.1", "swoft/cache": "^1.0", "swoft/redis": "^1.0", "swoft/console": "^1.0", "swoft/devtool": "^1.0", "swoft/session": "^1.0", "swoft/i18n": "^1.0", "swoft/process": "^1.0", "swoft/memory": "^1.0", "swoft/service-governance": "^1.0" }, "autoload": { "psr-4": { "App\\": "app/" }, "files": [ "app/Swoft.php" ] }, "autoload-dev": { "psr-4": { "Swoft\\Test\\": "test/" } }, "scripts": { "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ], "test": "./vendor/bin/phpunit -c phpunit.xml", "cs-fix": "./vendor/bin/php-cs-fixer fix $1" }, "repositories": [ { "type": "path", // 修改在此 "url": "../swoft-component" } ]}
我习惯删掉 require-dev
下配置的包, 而选择本地全局安装, 这点就全凭个人喜好啦
写在最后
希望大家看到 swoft demo 首页的 swoft
时, 能和我们一样开心