当前位置: 首页 > news >正文

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

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

 

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

相关文章:

  • Kubernetes单机部署操作学习
  • 第十周学习进度报告
  • 代码规范
  • 前端vue:节点、树以及虚拟 DOM
  • 【集合框架】JDK1.8源码分析之HashMap
  • leetcode--翻转二叉树
  • 学习笔记 12 数据库索引和锁
  • mac如何强制退出程序?强制退出程序的六种方法
  • 清空的回收站文件如何还原?这个方法超实用
  • Objc Runtime 类学习图(新旧版本)
  • sql插入时:注意事项
  • 函数的进阶
  • SFDC 开发实践
  • Python新手基础入门教程:那些年我们踩过的那些坑!
  • IT兄弟连 JavaWeb教程 Servlet会话跟踪 获取Session对象
  • [deviceone开发]-do_Webview的基本示例
  • Bytom交易说明(账户管理模式)
  • Docker: 容器互访的三种方式
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • node 版本过低
  • vue--为什么data属性必须是一个函数
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 讲清楚之javascript作用域
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 异步
  • Java性能优化之JVM GC(垃圾回收机制)
  • Prometheus VS InfluxDB
  • 积累各种好的链接
  • ​【已解决】npm install​卡主不动的情况
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​比特币大跌的 2 个原因
  • ​人工智能书单(数学基础篇)
  • $.ajax中的eval及dataType
  • (06)Hive——正则表达式
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十一)图像的罗伯特梯度锐化
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET MVC之AOP
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net 反编译_.net反编译的相关问题
  • .net 托管代码与非托管代码
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET6实现破解Modbus poll点表配置文件
  • .NET项目中存在多个web.config文件时的加载顺序
  • [ C++ ] STL_list 使用及其模拟实现
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [100天算法】-二叉树剪枝(day 48)
  • [AIGC] Spring Interceptor 拦截器详解
  • [Android]Android开发入门之HelloWorld
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)