本系列文章将从使用层面介绍 Swoft 框架的使用及业务开发,面向初中级的 PHPer

Swoft
首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈组件化框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的 PHP-FPM,全异步非阻塞 IO 实现,以类似于同步客户端的写法实现异步客户端的使用,没有复杂的异步回调,没有繁琐的 yield,有类似 Go 语言的协程、灵活的注解、强大的全局依赖注入容器、完善的服务治理、灵活强大的 AOP、标准的 PSR 规范实现等等,可以用于构建高性能的Web系统、API、中间件、基础服务等等。

前言

Swoft 是一个在 Swoole 之上构建的一个高性能协程 PHP 全栈框架,而 SwoolePHPer 里面是一个高级技能,所以在相关的环境安装上也给许多人造成了很大的困扰,Swoft 更是如此,本文将通过 Docker 以一种极其简单的方式解决运行环境和开发环境的部署。

Docker

从百科上可以看到,Docker 是一个开源的的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口,也可以理解为我们可以将我们的代码和运行环境打包到一个容器中,打包好的容器可以发布到任何流行的Linux机器上,这里指的Linux机器其实并不准确,得益于Docker for Windows项目和Hyper-V的发展,Docker也可以以不错的状态运行在Windows 10系统上,但笔者不建议将 Docker for Windows 用于生产环境上。

Docker 名词概念

这里对 Docker 常用的的一些名词进行简单的阐述和解释,以便新手对于下文的理解

  • DockerfileDockerfileDocker镜像 的描述文件,通过 docker build 命令来构建成为 镜像
  • 镜像(Image),通过 Dockerfile 构建得到,包含操作系统及运行环境
  • 容器(Container),容器是运行起来的镜像,可理解为镜像是Docker生命周期中的构建和打包阶段,而容器则是启动和执行阶段
  • 镜像仓库(Repository),用于储存构建好的 Docker镜像 的仓库,可理解为类似于 Git 的仓库

安装 Docker

Docker 的安装流程并不复杂,本节将介绍 LinuxWindows 10 系统下的安装流程,而 Mac 系统上并不建议采用 Docker 环境来运行或开发 Swoft 项目,因为在 Mac for Docker 上共享磁盘的性能极其的差,会导致 Swoft 在启动阶段耗时极长。

Linux 上安装 Dockerdocker-compose

Linux 上通过 yumapt-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 上安装 Dockerdocker-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/swoftGithub克隆(clone) Swoft 项目,并使用项目自带的 docker-compose.yml 文件来实现一个用于开发的环境,docker-compose.ymldocker-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: truetty: 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 bashdocker 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 即可完成安装以及启动操作了;

修改代码并使代码生效

SwoftPHP-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 搭建一个开发环境的更多相关文章

  1. Docker最全教程之使用Docker搭建Java开发环境(十七)

    前言 Java是一门面向对象的优秀编程语言,市场占有率极高,但是在容器化实践过程中,发现官方支持并不友好,同时与其他编程语言的基础镜像相比(具体见各语言镜像比较),确实是非常臃肿. 本篇仅作探索,希望 ...

  2. 在windows环境里,用Docker搭建Redis开发环境(新书第一个章节)

    大家都知道高并发分布式组件的重要性,而且如果要进大厂,这些技术不可或缺.但这些技术的学习难点在于,大多数项目里的分布式组件,都是搭建在Linux系统上,在自己的windows机器上很难搭建开发环境,如 ...

  3. 怎么使用Docker搭建PHP开发环境呢?

    在Docker流行之前,要搭建开发环境通常有两种选择:一种是使用wamp.xampp.mamp等集成开发环境安装包,另外一种就是使用普通虚拟机来安装linux服务器,然后通过下载一键安装包(如:lnm ...

  4. 使用Docker搭建LNMP开发环境

    1.什么是Docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技 ...

  5. Windows10系统下使用Docker搭建ClickHouse开发环境

    前提 随着现在业务开展,几个业务系统的数据量开始急剧膨胀.之前使用了关系型数据库MySQL进行了一次数据仓库的建模,发现了数据量上来后,大量的JOIN操作在提高了云MySQL的配置后依然有点吃不消,加 ...

  6. vue + skyline 搭建 一个开发环境

    1.之前用的是ext +  skyline搭建环境 ,正好最近是做前端的事情,有时间用vue + skyline 搭建一个三维场景 2.准备vue 2.x  ,UI 用的是iview 和element ...

  7. docker 搭建php 开发环境 添加扩展redis、swoole、xdebug

    docker-compose搭建lnmp 先决条件 首先需要安装docker 安装docker-compost 1.创建lnmp工作目录 #创建三个目录 mkdir lnmp && c ...

  8. 使用docker搭建OpenResty开发环境

    Dockerfile文件: FROM centos:latest RUN yum install -y pcre-devel openssl-devel gcc curl wget perl make ...

  9. 【IntelliJ IDEA新手入门】IDEA如何快速搭建Java开发环境

    作为IntelliJ IDEA mac新手,IDEA如何快速搭建Java开发环境呢? 今天小编就给大家带来了IntelliJ IDEA mac使用教程,想知道IDEA如何快速搭建Java开发环境?那就 ...

随机推荐

  1. 利用JFreeChart生成时序图(6) (转自 JSP开发技术大全)

    利用JFreeChart生成时序图(6) (转自 JSP开发技术大全) 14.6 利用JFreeChart生成时序图 通过JFreeChart插件只能生成普通效果的时序图,利用工厂类ChartFact ...

  2. 利用Oracle内置分析函数进行高效统计汇总

      分析函数是Oracle从8.1.6开始引入的一个新的概念,为我们分析数据提供了一种简单高效的处理方式.在分析函数出现以前,我们必须使用自联查询,子查询或者内联视图,甚至复杂的存储过程实现的语句,现 ...

  3. Java 泛型 三

    一.泛型初衷 Java集合不会知道我们需要用它来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对象,只要就具有很好的通用性.但这样做也带来两个问题: –集合对元素类型没有任何限制,这样可能引 ...

  4. codemirror插件-文件比较组件merge

    目的: 为了实现文件比较功能 引用文件 从github下载项目后,从以下路径引用文件,其中部分github分支中codemirror.js 需要运行项目,自动合成 <link rel=style ...

  5. LaTex简历排版

    为了写好简历,倒腾了好几天的Latex,主要是因为中文支持问题还有morderncv的更新问题... 1.  http://www.ctex.org/CTeXDownload/ 建议下载v2.9.2. ...

  6. EntityFramework:An error occurred while executing the command definition. See the inner exception for details.

    错误描述: 调用EF中的FirstOrDefault()时,报错误:An error occurred while executing the command definition. See the ...

  7. GitHub安装使用教程

      由于重复率比较大,为了尊重他人的成果,先在此注明本文是在学习了以下博文之后的一些总结归纳,并且说明了一些本人实际使用GitHub遇到的问题,并给出了解决办法 .本人的操作系统是window10,所 ...

  8. CF379F New Year Tree

    题意翻译 你是一个程序猿,现在有一棵新年树(并不是传统的带着叶子的树)--它有四个节点: 1,2,3,4. 其中2,3,4的父亲都是1. 新年里,程序猿们往往会做一些有趣的事情.你则选择以往这棵树上加 ...

  9. data和string类型之间的相互转换

    package main; import java.text.SimpleDateFormat;import java.util.Date; import freemarker.core.ParseE ...

  10. LN : leetcode 513 Find Bottom Left Tree Value

    lc 513 Find Bottom Left Tree Value 513 Find Bottom Left Tree Value Given a binary tree, find the lef ...