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

date: 2018-8-01 14:22:17
title: swoft| 源碼解讀系列一: 好難! swoft demo 都跑不起來怎麼破? docker 瞭解一下唄~
description: 閱讀 sowft 框架源碼, swoft 第一步, 搞定環境php

小夥伴剛接觸 swoft 的時候會感受 壓力有點大, 更直觀的說法是 . 開發組是不同意 這個說法的, swoft 的代碼都是 php 實現的, 而 php 又是 世界上最好的語言, swoft 的代碼閱讀起來是很輕鬆的.html

開發組會用 源碼解讀系列 博客, 深刻解讀 swoft. 咱們相信, 這會成爲一段輕鬆之旅.mysql

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

本篇內容速讀:nginx

  • 環境的鍋我不背: 學習和使用 swoft 須要預備這些 基礎知識.
  • docker: 搞定 swoft 環境
  • docker-compose: 搞定更多服務
  • 使用 composer 進行包管理: 開發組的平常

環境的鍋我不背

這個好難真心不是 swoft 的鍋, 這是環境的鍋. swoft 官方文檔已經提供了至關詳細的 環境搭建 說明, 若是一直沒法成功:git

  • 推薦 swoole 的運行環境是 linux, linux 的一些基本概念和操做是否掌握了
  • swoole 做爲 php 擴展的形式工做的, php 擴展的一些基本概念和安裝是否掌握
  • swoft 使用 composer 來進行包管理, composer 的一些基本概念和操做是否掌握了
  • 使用 swoft 來開發後端應用, 服務器的一些基礎知識(tcp/ip四層網絡協議, ip端口域名等)是否掌握了

學習和使用 swoft 須要預備這些 基礎知識.github

docker

那麼, 怎麼快速配好開發環境呢? 答案是 docker !web

docker 要上手比想象中的要容易, 開發組提供了 官方鏡像 swoft/swoft, 鏡像詳情在 swoft項目dockerfile 中, 摘錄其中配置 swoole 的部分:redis

# 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 文件的源碼.sql

固然, 爲了開發方便, 咱們可能須要構建不一樣的環境, 好比指定不一樣的 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\nhttp://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": {
            "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 時, 能和咱們同樣開心

相關文章
相關標籤/搜索