资讯专栏INFORMATION COLUMN

swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解

shenhualong / 1790人阅读

摘要:源码解读系列一好难都跑不起来怎么破了解一下呗阅读框架源码第一步搞定环境小伙伴刚接触的时候会感觉压力有点大更直观的说法是难开发组是不赞成难这个说法的的代码都是实现的而又是世界上最好的语言的代码阅读起来是很轻松的开发组会用源码解读系列博客深

date: 2018-8-01 14:22:17
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 extension
RUN 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.4
LABEL maintainer="1252409767@qq.com"
RUN echo -e "http://mirrors.ustc.edu.cn/alpine/v3.7/main
http://mirrors.ustc.edu.cn/alpine/v3.7/community" > /etc/apk/repositories && 
    apk update
RUN apk add tzdata && 
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && 
    echo "Asia/Shanghai" >  /etc/timezone
RUN apk add $PHPIZE_DEPS

# docker-php-ext
RUN docker-php-ext-install bcmath mysqli pcntl pdo_mysql

# pecl
# http://pecl.php.net/package/mongodb
RUN curl -O http://pecl.php.net/get/redis-4.0.2.tgz && 
    pecl install redis-4.0.2.tgz && 
    docker-php-ext-enable redis
RUN 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

# swoole
RUN 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": {
            "SwoftTest": "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.ucloud.cn/yun/29202.html

相关文章

  • swoft| 源码解读系列: 好难! swoft demo 跑不起来怎么? docker 了解

    摘要:源码解读系列一好难都跑不起来怎么破了解一下呗阅读框架源码第一步搞定环境小伙伴刚接触的时候会感觉压力有点大更直观的说法是难开发组是不赞成难这个说法的的代码都是实现的而又是世界上最好的语言的代码阅读起来是很轻松的开发组会用源码解读系列博客深 date: 2018-8-01 14:22:17title: swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? doc...

    rollback 评论0 收藏0
  • swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?

    摘要:源码解读系列二启动阶段都干了些啥阅读框架源码了解启动阶段的那些事儿小伙伴刚接触的时候会感觉压力有点大更直观的说法是难开发组是不赞成难这个说法的的代码都是实现的而又是世界上最好的语言的代码阅读起来是很轻松的之后开发组会用系列源码解读文章深 date: 2018-8-01 14:22:17title: swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?descriptio...

    hqman 评论0 收藏0
  • Swoft 源码解读

    摘要:官网源码解读号外号外欢迎大家我们开发组定了一个就线下聚一次的小目标里面的框架算是非常重的了这里的重先不具体到性能层面主要是框架的设计思想和框架集成的服务让框架可以既可以快速解决很多问题又可以轻松扩展中的框架有在应该无出其右了这次解读的源码 官网: https://www.swoft.org/源码解读: http://naotu.baidu.com/file/8... 号外号外, 欢迎大...

    weij 评论0 收藏0
  • Swoft 系列教程:(1)使用 Docker 安装部署 Swoft

    摘要:即异步非阻塞,,事件驱动。优雅的注解声明,容器,严格遵循规范。镜像的主要用途官方提供了基于的镜像。镜像中已安装配置好运行的所需组件及依赖。修改镜像的使得容器启动时不同时启动服务,这就不需要要求我们挂载的本地项目必须完全安装好依赖了。 之前有写过一篇 Docker 安装部署 Swoft 的文章,但有些冗余混乱,故重写作为教程的开篇。要不读读看? Swoft项目:https://gith...

    宋华 评论0 收藏0
  • Swoft 系列教程:(1)使用 Docker 安装部署 Swoft

    摘要:即异步非阻塞,,事件驱动。优雅的注解声明,容器,严格遵循规范。镜像的主要用途官方提供了基于的镜像。镜像中已安装配置好运行的所需组件及依赖。修改镜像的使得容器启动时不同时启动服务,这就不需要要求我们挂载的本地项目必须完全安装好依赖了。 之前有写过一篇 Docker 安装部署 Swoft 的文章,但有些冗余混乱,故重写作为教程的开篇。要不读读看? Swoft项目:https://gith...

    psychola 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<