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 要上手比想象中的要容易, 开发组提供了 官方镜像 swoft/swoft, 镜像详情在 swoft项目dockerfile 中, 摘录其中配置 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 版本, 设置中文镜像加速等, 也可以参考 gitee.com/daydaygo/docker 下的 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 服务编排(管理)起来, 举个例子 gitee.com/daydaygo/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 时, 能和我们一样开心

swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解一下呗~的更多相关文章

  1. swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?

    date: 2018-8-01 14:22:17title: swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?description: 阅读 sowft 框架源码, 了解 sowf ...

  2. swoft 源码解读【转】

      官网: https://www.swoft.org/ 源码解读: http://naotu.baidu.com/file/814e81c9781b733e04218ac7a0494e2a?toke ...

  3. Alamofire源码解读系列(三)之通知处理(Notification)

    本篇讲解swift中通知的用法 前言 通知作为传递事件和数据的载体,在使用中是不受限制的.由于忘记移除某个通知的监听,会造成很多潜在的问题,这些问题在测试中是很难被发现的.但这不是我们这篇文章探讨的主 ...

  4. Alamofire源码解读系列(五)之结果封装(Result)

    本篇讲解Result的封装 前言 有时候,我们会根据现实中的事物来对程序中的某个业务关系进行抽象,这句话很难理解.在Alamofire中,使用Response来描述请求后的结果.我们都知道Alamof ...

  5. Alamofire源码解读系列(二)之错误处理(AFError)

    本篇主要讲解Alamofire中错误的处理机制 前言 在开发中,往往最容易被忽略的内容就是对错误的处理.有经验的开发者,能够对自己写的每行代码负责,而且非常清楚自己写的代码在什么时候会出现异常,这样就 ...

  6. Alamofire源码解读系列(四)之参数编码(ParameterEncoding)

    本篇讲解参数编码的内容 前言 我们在开发中发的每一个请求都是通过URLRequest来进行封装的,可以通过一个URL生成URLRequest.那么如果我有一个参数字典,这个参数字典又是如何从客户端传递 ...

  7. Alamofire源码解读系列(六)之Task代理(TaskDelegate)

    本篇介绍Task代理(TaskDelegate.swift) 前言 我相信可能有80%的同学使用AFNetworking或者Alamofire处理网络事件,并且这两个框架都提供了丰富的功能,我也相信很 ...

  8. Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)

    Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager) 本篇主要讲解iOS开发中的网络监控 前言 在开发中,有时候我们需要获取这些信息: 手机是否联网 ...

  9. Alamofire源码解读系列(八)之安全策略(ServerTrustPolicy)

    本篇主要讲解Alamofire中安全验证代码 前言 作为开发人员,理解HTTPS的原理和应用算是一项基本技能.HTTPS目前来说是非常安全的,但仍然有大量的公司还在使用HTTP.其实HTTPS也并不是 ...

随机推荐

  1. Promethus安装指南

    由于Prometheus是go语言写的,所以不需要编译,安装的过程非常简单,仅需要解压然后运行.Prometheus官方下载地址:https://prometheus.io/download/ 安装P ...

  2. resultset 记录数

    JDBC中的ResultSet API没有直接获取记录条数的方法,现介绍几个: 方法一:利用ResultSet的getRow方法来获得ResultSet的总行数 Java代码 ResultSet rs ...

  3. 结对作业——四则运算 Part3. 对于结对编程的总结与思考

    结对作业——四则运算 Part3. 对于结对编程的总结与思考 PB15061303 刘梓轩PB16061489 艾寅中 GITHUB 地址 戳这里 目录 Part 1. Core代码编写部分 Part ...

  4. 用java实现一个简易编译器2-语法解析

  5. 【2018沈阳赛区网络预选赛J题】Fantastic Graph 【有上下界的网络流】

    要补的题太多了导致最近没写博客(好吧是我懒) 题目链接https://nanti.jisuanke.com/t/31447 题意 给出一个二分图,问能否挑选出一些边,使得每个点的度数都在[L,R]这个 ...

  6. 【CF#303D】Rotatable Number

    [题目描述] Bike是一位机智的少年,非常喜欢数学.他受到142857的启发,发明了一种叫做“循环数”的数. 如你所见,142857是一个神奇的数字,因为它的所有循环排列能由它乘以1,2,...,6 ...

  7. DBArtist之Oracle入门第2步: 了解Oracle的Database Control

    之前安装好数据库后,会有下面这个弹窗,然后根据Database Control URL地址进入瞧一瞧,看一看! 根据地址进入以后,是一个登录界面,用system账户登录,密码就是安装Oracle的时候 ...

  8. springMvc 核心配置

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  9. Spring框架总结(九)

    三.AOP编程 关注点代码:除了业务代码以外的代码.比如开启事务,关闭事务,异常处理核心业务代码:保存用户这一句才是重点.例子如下:// 保存一个用户public void add(User user ...

  10. app里面嵌套的H5页面上电话号码怎么才能点击拨号?

    代码: <p>联系我们:<a href="tel://66666666666">66666666666</a> </p>