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 的鍋, 這是環境的鍋. swoft 官方文檔已經提供了至關詳細的 環境搭建 說明, 若是一直沒法成功:git
學習和使用 swoft 須要預備這些 基礎知識.github
那麼, 怎麼快速配好開發環境呢? 答案是 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進行加速.
到這裏咱們已經有了 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 了
使用 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
時, 能和咱們同樣開心