Swoft 新手向教程 - 通过 Docker 搭建一个开发环境
本系列文章将从使用层面介绍 Swoft
框架的使用及业务开发,面向初中级的 PHPer
Swoft
首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈组件化框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的 PHP-FPM,全异步非阻塞 IO 实现,以类似于同步客户端的写法实现异步客户端的使用,没有复杂的异步回调,没有繁琐的 yield,有类似 Go 语言的协程、灵活的注解、强大的全局依赖注入容器、完善的服务治理、灵活强大的 AOP、标准的 PSR 规范实现等等,可以用于构建高性能的Web系统、API、中间件、基础服务等等。
前言
Swoft
是一个在 Swoole
之上构建的一个高性能协程 PHP 全栈框架
,而 Swoole
在 PHPer
里面是一个高级技能,所以在相关的环境安装上也给许多人造成了很大的困扰,Swoft
更是如此,本文将通过 Docker
以一种极其简单的方式解决运行环境和开发环境的部署。
Docker
从百科上可以看到,Docker
是一个开源的的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux
机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口,也可以理解为我们可以将我们的代码和运行环境打包到一个容器中,打包好的容器可以发布到任何流行的Linux
机器上,这里指的Linux机器其实并不准确,得益于Docker for Windows
项目和Hyper-V
的发展,Docker
也可以以不错的状态运行在Windows 10系统上,但笔者不建议将 Docker for Windows
用于生产环境上。
Docker 名词概念
这里对 Docker
常用的的一些名词进行简单的阐述和解释,以便新手对于下文的理解
Dockerfile
,Dockerfile
是Docker镜像
的描述文件,通过docker build
命令来构建成为镜像
- 镜像(
Image
),通过Dockerfile
构建得到,包含操作系统及运行环境 - 容器(
Container
),容器是运行起来的镜像,可理解为镜像是Docker
生命周期中的构建和打包阶段,而容器则是启动和执行阶段 - 镜像仓库(
Repository
),用于储存构建好的Docker镜像
的仓库,可理解为类似于Git
的仓库
安装 Docker
Docker
的安装流程并不复杂,本节将介绍 Linux
及 Windows 10
系统下的安装流程,而 Mac
系统上并不建议
采用 Docker
环境来运行或开发 Swoft
项目,因为在 Mac for Docker
上共享磁盘的性能极其的差,会导致 Swoft
在启动阶段耗时极长。
在 Linux
上安装 Docker
与 docker-compose
在 Linux
上通过 yum
和 apt-get
来 安装 Docker
的流程可谓是相当简单
CentOS:yum install docker -y
Ubuntu:apt-get install docker-engine -y
只需要根据系统的区别,在终端执行上面的一行命令即可完成 Docker
的安装,在安装完成之后我们需要执行一下 service docker start
命令来启动一下 Docker
服务。
在安装完 Docker
之后,我们还需要安装一下 docker-compose
以便于后续对 Docker 的使用
CentOS:yum install python-pip -y && pip install --upgrade pip && pip install -U docker-compose
Ubuntu:apt-get install python-pip -y && pip install --upgrade pip && pip install -U docker-compose
只需要根据系统的区别,在终端执行上面的一行命令即可完成 docker-compose
的安装。
在 Windows 10
上安装 Docker
与 docker-compose
我们直接到 Docker 官网下载对应的安装包 https://store.docker.com/edit...,非登录用户我们会看到 Please Login to Download
,意思是要我们先登录 Docker 账号好再下载,我们直接点击按钮到登录页面完成账号注册或登录即可在上面的链接页面通过点击 Get Docker
下载,注意这个账号后面我们在使用时也会用到。
下载完安装包后可直接运行安装包进行安装,整个过程可以说是傻瓜式的,持续的下一步即可,注意安装前需先开启系统的 Hyper-V
,开启流程相对简单可参考其它文章 https://segmentfault.com/a/11... ,注意 Hyper-V
是与 VMware
是冲突的,两者不能并存,只能择其一,如果你必须要使用虚拟机的话,比如 Vagrant
之类的工具,亦可在虚拟机内运行一个 Linux 系统
,然后根据本文关于 Linux 系统
的安装流程处理,在虚拟机内运行 Docker
作为开发环境。
最新版的 Docker
安装包已经包含了 docker-compose
了,也就无需再做多余的操作。
安装完成后,重启电脑,当你看到任务栏的 小鲸鱼(Docker Icon)
显示着 Docker is running
即表示 Docker
启动成功了。
![](https://img2018.cnblogs.com/blog/1504257/201811/1504257-20181118214517297-169010066.png)
我们需要右键 Docker
,点击 Sign in / Create Docker ID
登录我们刚才注册的 Docker ID
,以便获得我们可以从 DockerHub 中获取公共镜像的权限。
由于我们是用于开发使用,所以我们还需要授权一下共享目录的权限,右键 Docker
并点击 Settings
,设置界面切换到 Shared Drives
,勾选你项目代码所在的 磁盘盘符
,并点击右下角的 Apply
即可完成授权。
Swoft 开发环境
修改官方默认 docker-compose.yml
文件
我们通过命令 git clone https://github.com/swoft-cloud/swoft
从 Github
上 克隆(clone)
Swoft 项目,并使用项目自带的 docker-compose.yml
文件来实现一个用于开发的环境,docker-compose.yml
是 docker-compose
的编排配置文件, 我们看一下官方默认文件的内容:
```
version: '3'
services:
swoft:
container_name: swoft
image: swoft/swoft
ports:
- "80:80"
volumes:
- ./:/var/www/swoft
stdin_open: true
tty: true
entrypoint: ["php", "/var/www/swoft/bin/swoft", "start"]
```
这是一个相对简单的编排文件,仅仅只有 swoft
一个服务,也没有关联过多的内容,关于 docker-compose.yml
的文件格式我们这里不做过多的解释,可自行查找相关的内容进行阅读理解。
简单的解读此文件的内容可以理解为,使用了swoft/swoft
官方镜像并设置了容器名称为swoft
,绑定容器内的80
端口与宿主机的80
端口,设置./
当前目录与容器内的/var/www/swoft
目录为共享目录,开启与容器的交互式终端并于启动编排文件时启动Swoft
服务。
我们可以注意到默认编排文件上的 entrypoint
配置了 php /var/www/swoft/bin/swoft start
,也就是启动 Swoft 服务
的命令,但如果仅 克隆(clone)
项目并执行 docker-compose up
来尝试启动 容器
的话,我们会得到一个失败的结果,因为尚未执行 composer install
来加载 Composer
的依赖而缺少 vendor
文件夹和 autoload
等相关文件,导致无法正确运行 Swoft
实例,我们再看默认的编排文件设置了 stdin_open: true
和 tty: true
两个参数,分别对应 docker
命令上的 -i
和 -t
两个参数,简单的理解就是 -i
开启了 输入(input)
功能,-t
开启了一个连接容器里面的 交互式终端(terminal)
,我们可以利用这两个参数,并将编排文件的 entrypoint
行改为 entrypoint: ["sh"]
,使容器启动后不是直接启动 Swoft
服务,而是由我们手动通过 交互式终端(terminal)
进入容器内去启动。(注意Swoft官方已将入口从 command 改为了 entrypoint,本文已做对应的更新)
下面是一个更改后的 docker-compose.yml
文件实例:
```
version: '3'
services:
swoft:
container_name: swoft
image: swoft/swoft
ports:
- "80:80"
volumes:
- ./:/var/www/swoft
stdin_open: true
tty: true
entrypoint: ["sh"]
```
启动开发环境容器
此时我们在编排文件的所在目录启动一个 终端(Shell)
, 然后执行 docker-compose up -d
,-d
的意思是以守护模式(Daemon Mode)
运行,便于我们在同一个 终端(Shell)
进入到容器内,命令执行后我们可以看到 Starting swoft ... done
即表示启动容器成功。
如果在执行启动命令时得到一下错误,则说明宿主机的80
端口已经被占用了,更改 docker-compose.yml
文件内的 80:80
为其它未被占用的端口即可,注意第一个80
指的是宿主机的端口,第二个80
指的是容器内的端口,也就是说我们只需要更改第一个即可
ERROR: for swoft Cannot start service swoft: b'driver failed programming external connectivity on endpoint swoft(dab0f4d00620e2f5c07e33084ca5cac6f08cb48018d6b737eadc035e5aa0b597): Bind for 0.0.0.0:80 failed: port is already allocated'
进入开发环境容器
通过执行 docker ps
命令可以查看启动的容器信息,下面为示例信息:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f22173763374 swoft/swoft:latest "docker-php-entrypoin" About a minute ago Up About a minute 0.0.0.0:80->80/tcp swoft
得知 容器ID(Container ID)
为 f22173763374
,容器名称(Container Name)
为 swoft
,我们可以执行 docker exec -it f22173763374 bash
或 docker exec -it swoft bash
通过 交互式终端(terminal)
进入到容器内。
如执行时报错 the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
,可在 docker exec
命令前面增加 winpty
命令解决,即 winpty docker exec -it swoft bash
运行以及开发调试
安装 Composer
依赖及生成自动加载(Autoload)
文件
通过 docker exec
命令进入容器后,我们留意到光标左侧的内容变为 root@f22173763374:
即为已进入容器内,其中 f22173763374
为对应的 容器ID(Container ID)
。
由于 Swoft
官方镜像 swoft/swoft
配置的工作目录为 /var/www/swoft
,而 docker-compose.yml
又将项目当前目录
关联了容器 /var/www/swoft
目录,即通过 docker exec
进入的目录已经为 /var/www/swoft
目录,即项目目录,所以我们可以直接执行 composer install
命令来加载 Composer
的依赖并生成 自动加载(Autoload)
文件。
考虑到国内的网络环境,我们在执行 composer install
命令前可以先执行 composer config -g repo.packagist composer https://packagist.phpcomposer.com
命令配置 Composer 中国镜像源
加速安装速度。
启动 Swoft
服务
安装完 Composer
依赖后,便可以执行 php bin/swoft start
启动服务了,当你看到
root@f22173763374:/var/www/swoft# php bin/swoft start
Server Information
********************************************************************
* HTTP | host: 0.0.0.0, port: 80, type: 1, worker: 1, mode: 3
* TCP | host: 0.0.0.0, port: 8099, type: 1, worker: 1 (Enabled)
********************************************************************
Server has been started. (master PID: 15, manager PID: 16)
You can use CTRL + C to stop run.
即意味着你的 Swoft
以及启动成功了,我们可以打开浏览器访问一下 http://127.0.0.1:80
,当你看到下图即大功告成了!
如果你绑定宿主机的端口不是80
,则改成对应的即可;
如果访问看到的是 Redis connection failure host=127.0.0.1 port=6379
则说明缺少 Redis
服务,最简单直接的就是直接在当前容器内安装 Redis Server
,直接执行 apt install -y redis-server && service redis-server start
即可完成安装以及启动操作了;
修改代码并使代码生效
Swoft
跟 PHP-FPM
模式下的开发会有一点差异,在PHP-FPM
模式下直接改变代码内容,再访问对应的代码便能得到变更后的内容,是因为PHP-FPM
模式下每一次请求都会重新加载PHP代码,而 Swoft
是持久化运行
的,也就意味着代码在服务启动之后,接受的请求都无需重新加载,这个模式的变化可以使得 Swoft
的大量代码可被重复使用,而无需重新加载和重新实例化,大大提升性能的其中一点原因之一。
这样的变更对开发会造成一定程度的影响,也就是说在 Swoft
下,你需要 重启 Worker
或 重启服务
才能使变更的代码生效,但是得益于 Swoft
的 热重载
功能,可以自动检查代码变更并自动 重启 Worker
,我们只需通过项目根目录下的 .env
文件更改 AUTO_RELOAD
项为 true
即可,如项目根目录下没有 .env
文件,可直接复制 .env.example
文件为 .env
并作出对应的更改即可,有一点需要注意的是仅在改变 app
目录下的代码才会被 热重载
功能重载,改变其它代码不会被重载,这是由于不同代码是处于不同的生命周期导致的,仅 WorkerStart
之后加载的代码才能被重载,关于这部分的内容我们将在后续涉及到 Swoft 的生命周期
时再做进一步的讲解。
原文地址:https://segmentfault.com/a/1190000015759752
Swoft 新手向教程 - 通过 Docker 搭建一个开发环境的更多相关文章
- Docker最全教程之使用Docker搭建Java开发环境(十七)
前言 Java是一门面向对象的优秀编程语言,市场占有率极高,但是在容器化实践过程中,发现官方支持并不友好,同时与其他编程语言的基础镜像相比(具体见各语言镜像比较),确实是非常臃肿. 本篇仅作探索,希望 ...
- 在windows环境里,用Docker搭建Redis开发环境(新书第一个章节)
大家都知道高并发分布式组件的重要性,而且如果要进大厂,这些技术不可或缺.但这些技术的学习难点在于,大多数项目里的分布式组件,都是搭建在Linux系统上,在自己的windows机器上很难搭建开发环境,如 ...
- 怎么使用Docker搭建PHP开发环境呢?
在Docker流行之前,要搭建开发环境通常有两种选择:一种是使用wamp.xampp.mamp等集成开发环境安装包,另外一种就是使用普通虚拟机来安装linux服务器,然后通过下载一键安装包(如:lnm ...
- 使用Docker搭建LNMP开发环境
1.什么是Docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技 ...
- Windows10系统下使用Docker搭建ClickHouse开发环境
前提 随着现在业务开展,几个业务系统的数据量开始急剧膨胀.之前使用了关系型数据库MySQL进行了一次数据仓库的建模,发现了数据量上来后,大量的JOIN操作在提高了云MySQL的配置后依然有点吃不消,加 ...
- vue + skyline 搭建 一个开发环境
1.之前用的是ext + skyline搭建环境 ,正好最近是做前端的事情,有时间用vue + skyline 搭建一个三维场景 2.准备vue 2.x ,UI 用的是iview 和element ...
- docker 搭建php 开发环境 添加扩展redis、swoole、xdebug
docker-compose搭建lnmp 先决条件 首先需要安装docker 安装docker-compost 1.创建lnmp工作目录 #创建三个目录 mkdir lnmp && c ...
- 使用docker搭建OpenResty开发环境
Dockerfile文件: FROM centos:latest RUN yum install -y pcre-devel openssl-devel gcc curl wget perl make ...
- 【IntelliJ IDEA新手入门】IDEA如何快速搭建Java开发环境
作为IntelliJ IDEA mac新手,IDEA如何快速搭建Java开发环境呢? 今天小编就给大家带来了IntelliJ IDEA mac使用教程,想知道IDEA如何快速搭建Java开发环境?那就 ...
随机推荐
- 【T^T 1871】获取敌情
获取敌情 在公元4484年,人类展开了对外界星球的征途和探索,但也不可避免的展开了和外星人之间的战争.偶然的机遇之下,美国联邦调查局截获了一串来自外星球的信息.但不知道有什么特殊的意义.所以就委托你, ...
- 洛谷P1297 单选错位——期望
题目:https://www.luogu.org/problemnew/show/P1297 读懂题后就变得很简单啦: 对于一个问题和它的下一个问题,我们考虑: 设上一个问题有 a 个选项,下一个问题 ...
- Same origin policy
Chrome: Origin null is not allowed by Access-Control-Allow-Origin 的问题 发送 http request 时遇到 error: Ori ...
- MyBatis高级查询 存储过程
1.第一个存储过程 根据用户id查询用户其他信息 #第一个存储过程 #根据用户id查询用户其他信息 DROP PROCEDURE IF EXISTS `select_user_by_id`; DEL ...
- 连接mysql时提示java.sql.SQLException: Access denied for user 'root'@'DESKTOP-N2B2D9A' (using password: YES)
用root连接mysql时提示:访问被拒绝 检查一下mysql server是否开启,发现后台在运行着.. 然后查了一下mysql的用户表,发现root只能运行使用本地ip(localhost或者1 ...
- 【WIP】C基础语法
创建: 2017/06/17 更新: 2017/10/14 标题加上[WIP],增加创建时间 更新: 2018/02/05 被Objective-C引用部分加上id方便链接,代码放进代码模板 ...
- bzoj21012101: [Usaco2010 Dec]Treasure Chest 藏宝箱(滚动数组优化dp)
2101: [Usaco2010 Dec]Treasure Chest 藏宝箱 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 592 Solved: ...
- Java多线程(五)停止线程 interrupt
调用interrupt方法仅仅是在当前线程中打了一个停止的标记,并不是真正停止线程. this.interrupted() :测试当前线程是否已经中断,执行后具有将状态标志清除为false的功能 is ...
- SQL 理论知识总结
1..如何设计数据库 答:存储信息的大小,每次扩容的大小,冗余 2.SQL Server的两种索引是何形式?索引的作用?索引的优缺点? 答:集聚索引,非聚集索引.提高查询速度.但是会过多的占用磁盘空间 ...
- 51nod1298 圆与三角形
1298 圆与三角形 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三 ...