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 时, 能和我们一样开心
swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解一下呗~的更多相关文章
- swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?
date: 2018-8-01 14:22:17title: swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?description: 阅读 sowft 框架源码, 了解 sowf ...
- swoft 源码解读【转】
官网: https://www.swoft.org/ 源码解读: http://naotu.baidu.com/file/814e81c9781b733e04218ac7a0494e2a?toke ...
- Alamofire源码解读系列(三)之通知处理(Notification)
本篇讲解swift中通知的用法 前言 通知作为传递事件和数据的载体,在使用中是不受限制的.由于忘记移除某个通知的监听,会造成很多潜在的问题,这些问题在测试中是很难被发现的.但这不是我们这篇文章探讨的主 ...
- Alamofire源码解读系列(五)之结果封装(Result)
本篇讲解Result的封装 前言 有时候,我们会根据现实中的事物来对程序中的某个业务关系进行抽象,这句话很难理解.在Alamofire中,使用Response来描述请求后的结果.我们都知道Alamof ...
- Alamofire源码解读系列(二)之错误处理(AFError)
本篇主要讲解Alamofire中错误的处理机制 前言 在开发中,往往最容易被忽略的内容就是对错误的处理.有经验的开发者,能够对自己写的每行代码负责,而且非常清楚自己写的代码在什么时候会出现异常,这样就 ...
- Alamofire源码解读系列(四)之参数编码(ParameterEncoding)
本篇讲解参数编码的内容 前言 我们在开发中发的每一个请求都是通过URLRequest来进行封装的,可以通过一个URL生成URLRequest.那么如果我有一个参数字典,这个参数字典又是如何从客户端传递 ...
- Alamofire源码解读系列(六)之Task代理(TaskDelegate)
本篇介绍Task代理(TaskDelegate.swift) 前言 我相信可能有80%的同学使用AFNetworking或者Alamofire处理网络事件,并且这两个框架都提供了丰富的功能,我也相信很 ...
- Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)
Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager) 本篇主要讲解iOS开发中的网络监控 前言 在开发中,有时候我们需要获取这些信息: 手机是否联网 ...
- Alamofire源码解读系列(八)之安全策略(ServerTrustPolicy)
本篇主要讲解Alamofire中安全验证代码 前言 作为开发人员,理解HTTPS的原理和应用算是一项基本技能.HTTPS目前来说是非常安全的,但仍然有大量的公司还在使用HTTP.其实HTTPS也并不是 ...
随机推荐
- Linux环境下搭建python+selenium+webdriver环境
1.下载并安装python,一般安装linux系统,自带有python,则python不用安装.要下载可以在官网上下载: 或者使用下面命令安装: sudo apt-get install python ...
- Linux内核SPI支持概述
1. 什么是SPI? Serial Peripheral Interface是一种同步4线串口链路,用于连接传感器.内存和外设到微控制器.他是一种简单的事实标准,还不足以复杂到需要一份正式的规范.SP ...
- Nginx通过CORS实现跨域
Nginx通过CORS实现跨域 2016-09-01 10:33 阅读 9.4k 评论 0 社区广播:运维派(Yunweipai.com)是国内最早成立的IT运维社区,欢迎大家投稿,让运维人不再孤寂的 ...
- lucene4
在lucene通过对应的API建立索引.在学习的过程中我们了解到lucene下面索引的建立与关系数据库有相似的地方. IndexReader.delete删除有两种删除的形式. 第三个改变Docume ...
- Action的方法访问
-------------------siwuxie095 Action 的方法访问 Action 的方法访问方式共有三种,如下: 1.通过 method 属性的配置实现 在 action 标签的 m ...
- copy&mutableCopy 浅拷贝(shallow copy)深拷贝 (deep copy)
写在前面 其实看了这么多,总结一个结论: 拷贝的初衷的目的就是为了:修改原来的对象不能影响到拷贝出来得对象 && 修改拷贝出来的对象也不能影响到原来的对象 所以,如果原来对象就是imm ...
- Bigtable:一个分布式的结构化数据存储系统
Bigtable:一个分布式的结构化数据存储系统 摘要 Bigtable是一个管理结构化数据的分布式存储系统,它被设计用来处理海量数据:分布在数千台通用服务器上的PB级的数据.Google的很多项目将 ...
- 全新的css网站布局--Grid布局
Grid布局全新的css网站布局 CSS Grid 布局由两个核心组成部分是 wrapper(父元素)和 items(子元素). wrapper 是实际的 grid(网格),items 是 grid( ...
- Windows下redis的安装与使用
Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
- Linux虚拟机安装配置手册(版本:7.3)
一.准备 ①.安装VMWare 安装步骤省略.我这里使用的版本如下: ②.Linux系统镜像文件: 建议使用最新版本的Linux系统.有些组件对系统内核版本要求比较高,有可能会产生错误. 我这里使用的 ...