博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解一下呗~
阅读量:6510 次
发布时间:2019-06-24

本文共 6158 字,大约阅读时间需要 20 分钟。

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 时, 能和我们一样开心

 

转载于:https://www.cnblogs.com/liliuguang/p/10794070.html

你可能感兴趣的文章