1. 程式人生 > >swoft| 源碼解讀系列一: 好難! swoft demo 都跑不起來怎麽破? docker 了解一下唄~

swoft| 源碼解讀系列一: 好難! swoft demo 都跑不起來怎麽破? docker 了解一下唄~

mas 官方 compose 應用 exist doc nproc sock open

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="[email protected]"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 了解一下唄~