本篇文章给大家分享的内容是关于如何通过docker搭建一个swoft开发环境 ,内容很详细,有需要的朋友可以参考一下,希望可以帮助到你们。
swoft
首个基于 swoole 原生协程的新时代 php 高性能协程全栈组件化框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的 php-fpm,全异步非阻塞 io 实现,以类似于同步客户端的写法实现异步客户端的使用,没有复杂的异步回调,没有繁琐的 yield,有类似 go 语言的协程、灵活的注解、强大的全局依赖注入容器、完善的服务治理、灵活强大的 aop、标准的 psr 规范实现等等,可以用于构建高性能的web系统、api、中间件、基础服务等等。
swoft
是一个在swoole
之上构建的一个高性能协程 php 全栈框架
,而swoole
在phper
里面是一个高级技能,所以在相关的环境安装上也给许多人造成了很大的困扰,swoft
更是如此,本文将通过docker
以一种极其简单的方式解决运行环境和开发环境的部署。
从百科上可以看到,docker
是一个开源的的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux
机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口,也可以理解为我们可以将我们的代码和运行环境打包到一个容器中,打包好的容器可以发布到任何流行的linux
机器上,这里指的linux机器其实并不准确,得益于docker for windows
项目和hyper-v
的发展,docker
也可以以不错的状态运行在windows 10系统上,但笔者不建议将docker for windows
用于生产环境上。
这里对docker
常用的的一些名词进行简单的阐述和解释,以便新手对于下文的理解
dockerfile
,dockerfile
是docker镜像
的描述文件,通过docker build
命令来构建成为镜像
镜像(image
),通过dockerfile
构建得到,包含操作系统及运行环境容器(container
),容器是运行起来的镜像,可理解为镜像是docker
生命周期中的构建和打包阶段,而容器则是启动和执行阶段镜像仓库(repository
),用于储存构建好的docker镜像
的仓库,可理解为类似于git
的仓库6 29事故docker
的安装流程并不复杂,本节将介绍linux
及windows 10
系统下的安装流程,而mac
系统上并不建议
采用docker
环境来运行或开发swoft
项目,因为在mac for docker
上共享磁盘的性能极其的差,会导致swoft
在启动阶段耗时极长。
linux
上安装docker
与docker-compo
在linux
上通过yum
和apt-get
来 安装docker
的流程可谓是相当简单
centos:yum install docker -y
ubuntu:apt-get install docker-engine -y
只需要根据系统的区别,在终端执行上面的一行命令即可完成docker
的安装,在安装完成之后我们需要执行一下rvice docker start
命令来启动一下docker
服务。
在安装完docker
之后,我们还需要安装一下docker-compo
以便于后续对 docker 的使用
centos:yum install python-pip -y && pip install --upgrade pip && pip install -u docker-compo
ubuntu:apt-get install python-pip -y && pip install --upgrade pip && pip install -u docker-compo
只需要根据系统的区别,在终端执行上面的一行命令即可完成docker-compo
的安装。
windows 10
上安装docker
与docker-compo
我们直接到 docker 官网下载对应的安装包https://store.docker.com/edi企业会计准则解释第3号t...,非登录用户我们会看到plea login to download
,意思是要我们先登录 docker 账号好再下载,我们直接点击按钮到登录页面完成账号注册或登录即可在上面的链接页面通过点击get docker
下载,注意这个账号后面我们在使用时也会用到。
下载完安装包后可直接运行安装包进行安装,整个过程可以说是傻瓜式的,持续的下一步即可,注意安装前疫情英语作文需先开启系统的hyper-v
,开启流程相对简单可参考其它文章https://gmentfault.com/a/11... ,注意hyper-v
是与vmware
是冲突的,两者不能并存,只能择其一,如果你必须要使用虚拟机的话,比如vagrant
之类的工具,亦可在虚拟机内运行一个linux 系统
,然后根据本文关于linux 系统
的安装流程处理,在虚拟机内运行docker
作为开发环境。
最新版的docker
安装包已经包含了docker-compo
了,也就无需再做多余的操作。
安装完成后,重启电脑,当你看到任务栏的小鲸鱼(docker icon)
显示着docker is running
即表示docker
启动成功了。
我们需要右键docker
,点击sign in / create docker id
登录我们刚才注册的docker id
,以便获得我们可以从 dockerhub 中获取公共镜像的权限。
由于我们是用于开发使用,所以我们还需要授权一下共享目录的权限,右键docker
并点击ttings
,设置界面切换到shared drives
,勾选你项目代码所在的磁盘盘符
,并点击右下角的apply
即可完成授权。
docker-compo.yml
文件我们通过命令git clone https://github.com/swoft-cloud/swoft
从github
上克隆(clone)
swoft 项目,并使用项目自带的docker-compo.yml
文件来实现一个用于开发的环境,docker-compo.yml
是docker-compo
的编排配置文件, 我们看一下官方默认文件的内容:
version: '3'rvices: swoft: container_name: swoft image: swoft/swoft ports: - "80:80" volumes: - ./:/var/www/swoft stdin_open: true tty: true command: php /var/www/swoft/bin/swoft start
这是一个相对简单的编排文件,仅仅只有swoft
一个服务,也没有关联过多的内容,关于docker-compo.yml
的文件格式我们这里不做过多的解释,可自行查找相关的内容进行阅读理解。
简单的解读此文件的内容可以理解为,使用了swoft/swoft
官方镜像并设置了容器名称为swoft
,绑定容器内的80
端口与宿主机的80
端口,设置./
当前目录与容器内的/var/www/swoft
目录为共享目录,开启与容器的交互式终端并于启动编排文件时启动swoft
服务。
我们可以注意到默认编排文件上的command
配置了php /var/www/swoft/bin/swoft start
,也就是启动 swoft 服务
的命令,但如果仅克隆(clone)
项目并执行docker-compo up
来尝试启动容器
的话,我们会得到一个失败的结果,因为尚未执行compor insta正压力ll
来加载compor
的依赖而缺少vendor
文件夹和autoload
等相关文件,导致无法正确运行swoft
实例,我们再看默认的编排文件设置了stdin_open: true
和tty: true
两个参数,分别对应docker
命令上的-i
和-t
两个参数,简单的理解就是-i
开启了输入(input)
功能,-t
开启了一个连接容器里面的交互式终端(terminal)
,我们可以利用这两个参数,并将编排文件的command
行改为command: /bin/bash
,使容器启动后不是直接启动swoft
服务,而是由我们手动通过交互式终端(terminal)
进入容器内去启动。
下面是一个更改后的docker-compo.yml
文件实例:
version: '3'rvices: swoft: container_name: swoft image: swoft/swoft ports: - "80:80" volumes: - ./:/var/www/swoft stdin_open: true tty: true command: /bin/bash
此时我们在编排文件的所在目录启动一个终端(shell)
, 然后执行docker-compo up -d
,-d
的意思是以守护模式(daemon mode)
运行,便于我们在同一个终端(shell)
进入到容器内,命令执行后我们可以看到starting swoft ... done
即表示启动容器成功。
如果在执行启动命令时得到一下错误,则说明宿主机的80
端口已经被占用了,更改docker-compo.yml
文件内的80:80
为其它未被占用的端口即可,注意第一个80
指的是宿主机的端口,第二个80
指的是容器内的端口,也就是说我们只需要更改第一个即可
error: for swoft cannot start rvice 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 namesf22173763374 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
compor
依赖及生成自动加载(autoload)
文件通过docker exec
命令进入容器后,我们留意到光标左侧的内容变为root@f22173763374:
即为已进入容器内,其中f22173763374
为对应的容器id(container id)
。
由于swoft
官方镜像swoft/swoft
配置的工作目录为/var/www/swoft
,而docker-compo.yml
又将项目当前目录
关联了容器/var/www/swoft
目录,即通过docker exec
进入的目录已经为/var/www/swoft
目录,即项目目录,所以我们可以直接执行compor install
命令来加载compor
的依赖并生成自动加载(autoload)
文件。
考虑到国内的网络环境,我们在执行compor install
命令前可以先执行compor config -g repo.packagist compor https://packagist.phpcompor.com
命令配置compor 中国镜像源
加速安装速度。
swoft
服务安装完compor
依赖后,便可以执行php bin/swoft start
启动服务了,当你看到
root@f22173763374:/var/www/swoft# php bin/swoft start rver information********************************************************************* http | host: 0.0.0.0, port: 81, type: 1, worker: 1, mode: 3* tcp | host: 0.0.0.0, port: 8099, type: 1, worker: 1 (enabled)********************************************************************rver has been started. (master pid: 15, manager pid: 16)you can u 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 rver
,直接执行apt install -y redis-rver && rvice redis-rver 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 的生命周期
时再做进一步的讲解。
更多php相关知识请关注我的专栏phpzhuanlan.zhihu.com
本文发布于:2023-04-08 00:24:41,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/21003aed1e6207179a9598aa5fbf86ca.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:如何通过Docker搭建一个swoft开发环境.doc
本文 PDF 下载地址:如何通过Docker搭建一个swoft开发环境.pdf
留言与评论(共有 0 条评论) |