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也并不是 ...
随机推荐
- springmvc 下载excel
jsp: controller:
- ORM思想
-------------------siwuxie095 什么是 ORM 思想 1.Hibernate 使用 ORM 思想对数据库进行 CRUD 操作 2.ORM:Object Relational ...
- C++——堆、栈、静态存储区
栈 堆 静态存储区 生命周期 函数结束即释放 new,malloc开辟,delete,free释放 释放前,一直存在 最长,程序退出才释放 程序.局部变量 new,malloc申请的空间,用于 ...
- 深入浅出iptables
一. 防火墙是什么 1. 防火墙简述 防火墙是指设置在不同网络或网络安全域之间的一系列部件的组合,它能增强机构内部网络的安全性.它通过访问控制机制,确定哪些内部服务允许外部访问,以及允许哪些外部请求可 ...
- 对max_allowed_packet这个参数的误解
之前一篇文章知识对,这个参数一个泛泛的概念,但是并没有理解这个参数的真正意义,现在差不多有那么点儿感觉了,主要的意思是每一条记录是一个包,不可拆分,而且包括blob,text等大字段.
- 洛谷 P2850 [USACO06DEC]虫洞Wormholes 判负环
虫洞(wormhole) FJ 在农场上闲逛时,发现他的农场里有很多虫洞.虫洞是一条特殊的有向路径,当 FJ 从它的一头走到另一头后,他将被传送到过去的某个时刻.FJ 的每个农场包括 N(1<= ...
- xml与java代码相互装换的工具类
这是一个java操作xml文件的工具类,最大的亮点在于能够通过工具类直接生成xml同样层次结构的java代码,也就是说,只要你定义好了xml的模板,就能一键生成java代码.省下了自己再使用工具类写代 ...
- [原创]Linux下使用Daemon实现服务器永久存活
很多服务器端设计者,很少会考虑到服务器永久存活或热替换的问题,貌似真的很少 其中永久存活最大的理论支持就是,我们如何真正的保证一组服务器持续的存在,即便宕机? 其实没有人能保证自己写的代码那么完美无瑕 ...
- mysql存储过程和触发器
mysql编程(存储过程和触发器) 存储过程 什么是存储过程 存储过程,带有逻辑的sql语句 存储过程特点 执行效率非常快!存储过程是在数据库的服务器端执行的!!! 移植性很差!不同数据库的存储过程是 ...
- MP3 Lame 转换 参数 设置(转)
我们在对音频格式的转换中,打交道最多的就是MP3了.如果你能彻底玩转MP3,那么对你的音频创作和对其他音频格式的掌握会有很大的帮助.下面我们给大家介绍MP3制作软件:LAME 要制作出高音质的MP3靠 ...