摘要:前言是一個(gè)在之上構(gòu)建的一個(gè)高性能協(xié)程全??蚣?,而在里面是一個(gè)高級(jí)技能,所以在相關(guān)的環(huán)境安裝上也給許多人造成了很大的困擾,更是如此,本文將通過(guò)以一種極其簡(jiǎn)單的方式解決運(yùn)行環(huán)境和開(kāi)發(fā)環(huán)境的部署。
本系列文章將從使用層面介紹 Swoft 框架的使用及業(yè)務(wù)開(kāi)發(fā),面向初中級(jí)的 PHPer
Swoft前言
首個(gè)基于 Swoole 原生協(xié)程的新時(shí)代 PHP 高性能協(xié)程全棧組件化框架,內(nèi)置協(xié)程網(wǎng)絡(luò)服務(wù)器及常用的協(xié)程客戶端,常駐內(nèi)存,不依賴傳統(tǒng)的 PHP-FPM,全異步非阻塞 IO 實(shí)現(xiàn),以類似于同步客戶端的寫(xiě)法實(shí)現(xiàn)異步客戶端的使用,沒(méi)有復(fù)雜的異步回調(diào),沒(méi)有繁瑣的 yield,有類似 Go 語(yǔ)言的協(xié)程、靈活的注解、強(qiáng)大的全局依賴注入容器、完善的服務(wù)治理、靈活強(qiáng)大的 AOP、標(biāo)準(zhǔn)的 PSR 規(guī)范實(shí)現(xiàn)等等,可以用于構(gòu)建高性能的Web系統(tǒng)、API、中間件、基礎(chǔ)服務(wù)等等。
Swoft 是一個(gè)在 Swoole 之上構(gòu)建的一個(gè)高性能協(xié)程 PHP 全??蚣?/b>,而 Swoole 在 PHPer 里面是一個(gè)高級(jí)技能,所以在相關(guān)的環(huán)境安裝上也給許多人造成了很大的困擾,Swoft 更是如此,本文將通過(guò) Docker 以一種極其簡(jiǎn)單的方式解決運(yùn)行環(huán)境和開(kāi)發(fā)環(huán)境的部署。
Docker從百科上可以看到,Docker 是一個(gè)開(kāi)源的的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的Linux機(jī)器上,也可以實(shí)現(xiàn)虛擬化,容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口,也可以理解為我們可以將我們的代碼和運(yùn)行環(huán)境打包到一個(gè)容器中,打包好的容器可以發(fā)布到任何流行的Linux機(jī)器上,這里指的Linux機(jī)器其實(shí)并不準(zhǔn)確,得益于Docker for Windows項(xiàng)目和Hyper-V的發(fā)展,Docker也可以以不錯(cuò)的狀態(tài)運(yùn)行在Windows 10系統(tǒng)上,但筆者不建議將 Docker for Windows 用于生產(chǎn)環(huán)境上。
Docker 名詞概念這里對(duì) Docker 常用的的一些名詞進(jìn)行簡(jiǎn)單的闡述和解釋,以便新手對(duì)于下文的理解
Dockerfile,Dockerfile 是 Docker鏡像 的描述文件,通過(guò) docker build 命令來(lái)構(gòu)建成為 鏡像
鏡像(Image),通過(guò) Dockerfile 構(gòu)建得到,包含操作系統(tǒng)及運(yùn)行環(huán)境
容器(Container),容器是運(yùn)行起來(lái)的鏡像,可理解為鏡像是Docker生命周期中的構(gòu)建和打包階段,而容器則是啟動(dòng)和執(zhí)行階段
鏡像倉(cāng)庫(kù)(Repository),用于儲(chǔ)存構(gòu)建好的 Docker鏡像 的倉(cāng)庫(kù),可理解為類似于 Git 的倉(cāng)庫(kù)
安裝 DockerDocker 的安裝流程并不復(fù)雜,本節(jié)將介紹 Linux 及 Windows 10 系統(tǒng)下的安裝流程,而 Mac 系統(tǒng)上并不建議采用 Docker 環(huán)境來(lái)運(yùn)行或開(kāi)發(fā) Swoft 項(xiàng)目,因?yàn)樵?Mac for Docker 上共享磁盤(pán)的性能極其的差,會(huì)導(dǎo)致 Swoft 在啟動(dòng)階段耗時(shí)極長(zhǎng)。
在 Linux 上安裝 Docker 與 docker-compose在 Linux 上通過(guò) yum 和 apt-get 來(lái) 安裝 Docker 的流程可謂是相當(dāng)簡(jiǎn)單
CentOS:yum install docker -y
Ubuntu:apt-get install docker-engine -y
只需要根據(jù)系統(tǒng)的區(qū)別,在終端執(zhí)行上面的一行命令即可完成 Docker 的安裝,在安裝完成之后我們需要執(zhí)行一下 service docker start 命令來(lái)啟動(dòng)一下 Docker 服務(wù)。
在安裝完 Docker 之后,我們還需要安裝一下 docker-compose 以便于后續(xù)對(duì) 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
只需要根據(jù)系統(tǒng)的區(qū)別,在終端執(zhí)行上面的一行命令即可完成 docker-compose 的安裝。
我們直接到 Docker 官網(wǎng)下載對(duì)應(yīng)的安裝包 https://store.docker.com/edit...,非登錄用戶我們會(huì)看到 Please Login to Download ,意思是要我們先登錄 Docker 賬號(hào)好再下載,我們直接點(diǎn)擊按鈕到登錄頁(yè)面完成賬號(hào)注冊(cè)或登錄即可在上面的鏈接頁(yè)面通過(guò)點(diǎn)擊 Get Docker 下載,注意這個(gè)賬號(hào)后面我們?cè)谑褂脮r(shí)也會(huì)用到。
下載完安裝包后可直接運(yùn)行安裝包進(jìn)行安裝,整個(gè)過(guò)程可以說(shuō)是傻瓜式的,持續(xù)的下一步即可,注意安裝前需先開(kāi)啟系統(tǒng)的 Hyper-V,開(kāi)啟流程相對(duì)簡(jiǎn)單可參考其它文章 https://segmentfault.com/a/11... ,注意 Hyper-V 是與 VMware 是沖突的,兩者不能并存,只能擇其一,如果你必須要使用虛擬機(jī)的話,比如 Vagrant 之類的工具,亦可在虛擬機(jī)內(nèi)運(yùn)行一個(gè) Linux 系統(tǒng),然后根據(jù)本文關(guān)于 Linux 系統(tǒng) 的安裝流程處理,在虛擬機(jī)內(nèi)運(yùn)行 Docker 作為開(kāi)發(fā)環(huán)境。
最新版的 Docker 安裝包已經(jīng)包含了 docker-compose 了,也就無(wú)需再做多余的操作。
安裝完成后,重啟電腦,當(dāng)你看到任務(wù)欄的 小鯨魚(yú)(Docker Icon) 顯示著 Docker is running 即表示 Docker 啟動(dòng)成功了。
我們需要右鍵 Docker,點(diǎn)擊 Sign in / Create Docker ID 登錄我們剛才注冊(cè)的 Docker ID,以便獲得我們可以從 DockerHub 中獲取公共鏡像的權(quán)限。
由于我們是用于開(kāi)發(fā)使用,所以我們還需要授權(quán)一下共享目錄的權(quán)限,右鍵 Docker 并點(diǎn)擊 Settings,設(shè)置界面切換到 Shared Drives,勾選你項(xiàng)目代碼所在的 磁盤(pán)盤(pán)符,并點(diǎn)擊右下角的 Apply 即可完成授權(quán)。
Swoft 開(kāi)發(fā)環(huán)境 修改官方默認(rèn) docker-compose.yml 文件我們通過(guò)命令 git clone https://github.com/swoft-cloud/swoft 從 Github 上 克隆(clone) Swoft 項(xiàng)目,并使用項(xiàng)目自帶的 docker-compose.yml 文件來(lái)實(shí)現(xiàn)一個(gè)用于開(kāi)發(fā)的環(huán)境,docker-compose.yml 是 docker-compose 的編排配置文件, 我們看一下官方默認(rèn)文件的內(nèi)容:
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"]
這是一個(gè)相對(duì)簡(jiǎn)單的編排文件,僅僅只有 swoft 一個(gè)服務(wù),也沒(méi)有關(guān)聯(lián)過(guò)多的內(nèi)容,關(guān)于 docker-compose.yml 的文件格式我們這里不做過(guò)多的解釋,可自行查找相關(guān)的內(nèi)容進(jìn)行閱讀理解。
簡(jiǎn)單的解讀此文件的內(nèi)容可以理解為,使用了swoft/swoft官方鏡像并設(shè)置了容器名稱為swoft,綁定容器內(nèi)的80端口與宿主機(jī)的80端口,設(shè)置./當(dāng)前目錄與容器內(nèi)的/var/www/swoft目錄為共享目錄,開(kāi)啟與容器的交互式終端并于啟動(dòng)編排文件時(shí)啟動(dòng)Swoft服務(wù)。
我們可以注意到默認(rèn)編排文件上的 entrypoint 配置了 php /var/www/swoft/bin/swoft start,也就是啟動(dòng) Swoft 服務(wù)的命令,但如果僅 克隆(clone) 項(xiàng)目并執(zhí)行 docker-compose up 來(lái)嘗試啟動(dòng) 容器 的話,我們會(huì)得到一個(gè)失敗的結(jié)果,因?yàn)樯形磮?zhí)行 composer install 來(lái)加載 Composer 的依賴而缺少 vendor 文件夾和 autoload 等相關(guān)文件,導(dǎo)致無(wú)法正確運(yùn)行 Swoft 實(shí)例,我們?cè)倏茨J(rèn)的編排文件設(shè)置了 stdin_open: true 和 tty: true 兩個(gè)參數(shù),分別對(duì)應(yīng) docker 命令上的 -i 和 -t 兩個(gè)參數(shù),簡(jiǎn)單的理解就是 -i 開(kāi)啟了 輸入(input)功能,-t 開(kāi)啟了一個(gè)連接容器里面的 交互式終端(terminal) ,我們可以利用這兩個(gè)參數(shù),并將編排文件的 entrypoint 行改為 entrypoint: ["sh"] ,使容器啟動(dòng)后不是直接啟動(dòng) Swoft 服務(wù),而是由我們手動(dòng)通過(guò) 交互式終端(terminal) 進(jìn)入容器內(nèi)去啟動(dòng)。(注意Swoft官方已將入口從 command 改為了 entrypoint,本文已做對(duì)應(yīng)的更新)
下面是一個(gè)更改后的 docker-compose.yml 文件實(shí)例:
version: "3" services: swoft: container_name: swoft image: swoft/swoft ports: - "80:80" volumes: - ./:/var/www/swoft stdin_open: true tty: true entrypoint: ["sh"]啟動(dòng)開(kāi)發(fā)環(huán)境容器
此時(shí)我們?cè)诰幣盼募乃谀夸泦?dòng)一個(gè) 終端(Shell), 然后執(zhí)行 docker-compose up -d,-d 的意思是以守護(hù)模式(Daemon Mode) 運(yùn)行,便于我們?cè)谕粋€(gè) 終端(Shell) 進(jìn)入到容器內(nèi),命令執(zhí)行后我們可以看到 Starting swoft ... done 即表示啟動(dòng)容器成功。
如果在執(zhí)行啟動(dòng)命令時(shí)得到一下錯(cuò)誤,則說(shuō)明宿主機(jī)的80端口已經(jīng)被占用了,更改 docker-compose.yml 文件內(nèi)的 80:80 為其它未被占用的端口即可,注意第一個(gè)80指的是宿主機(jī)的端口,第二個(gè)80指的是容器內(nèi)的端口,也就是說(shuō)我們只需要更改第一個(gè)即可
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"進(jìn)入開(kāi)發(fā)環(huán)境容器
通過(guò)執(zhí)行 docker ps 命令可以查看啟動(dòng)的容器信息,下面為示例信息:
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,我們可以執(zhí)行 docker exec -it f22173763374 bash 或 docker exec -it swoft bash 通過(guò) 交互式終端(terminal) 進(jìn)入到容器內(nèi)。
如執(zhí)行時(shí)報(bào)錯(cuò) 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
運(yùn)行以及開(kāi)發(fā)調(diào)試 安裝 Composer 依賴及生成自動(dòng)加載(Autoload)文件通過(guò) docker exec 命令進(jìn)入容器后,我們留意到光標(biāo)左側(cè)的內(nèi)容變?yōu)?root@f22173763374: 即為已進(jìn)入容器內(nèi),其中 f22173763374 為對(duì)應(yīng)的 容器ID(Container ID)。
由于 Swoft 官方鏡像 swoft/swoft 配置的工作目錄為 /var/www/swoft,而 docker-compose.yml 又將項(xiàng)目當(dāng)前目錄關(guān)聯(lián)了容器 /var/www/swoft 目錄,即通過(guò) docker exec 進(jìn)入的目錄已經(jīng)為 /var/www/swoft 目錄,即項(xiàng)目目錄,所以我們可以直接執(zhí)行 composer install 命令來(lái)加載 Composer 的依賴并生成 自動(dòng)加載(Autoload) 文件。
考慮到國(guó)內(nèi)的網(wǎng)絡(luò)環(huán)境,我們?cè)趫?zhí)行 composer install 命令前可以先執(zhí)行 composer config -g repo.packagist composer https://packagist.phpcomposer.com 命令配置 Composer 中國(guó)鏡像源 加速安裝速度(由于近期Packagist中國(guó)鏡像源一直處于不可用狀態(tài),建議轉(zhuǎn)至Laravel-China中國(guó)源,即 config -g repo.packagist composer https://packagist.laravel-china.org)。
安裝完 Composer 依賴后,便可以執(zhí)行 php bin/swoft start 啟動(dòng)服務(wù)了,當(dāng)你看到
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 以及啟動(dòng)成功了,我們可以打開(kāi)瀏覽器訪問(wèn)一下 http://127.0.0.1:80,當(dāng)你看到下圖即大功告成了!
如果你綁定宿主機(jī)的端口不是80,則改成對(duì)應(yīng)的即可;
如果訪問(wèn)看到的是 Redis connection failure host=127.0.0.1 port=6379 則說(shuō)明缺少 Redis 服務(wù),最簡(jiǎn)單直接的就是直接在當(dāng)前容器內(nèi)安裝 Redis Server,直接執(zhí)行 apt install -y redis-server && service redis-server start 即可完成安裝以及啟動(dòng)操作了;
Swoft 跟 PHP-FPM 模式下的開(kāi)發(fā)會(huì)有一點(diǎn)差異,在PHP-FPM模式下直接改變代碼內(nèi)容,再訪問(wèn)對(duì)應(yīng)的代碼便能得到變更后的內(nèi)容,是因?yàn)?b>PHP-FPM模式下每一次請(qǐng)求都會(huì)重新加載PHP代碼,而 Swoft 是持久化運(yùn)行的,也就意味著代碼在服務(wù)啟動(dòng)之后,接受的請(qǐng)求都無(wú)需重新加載,這個(gè)模式的變化可以使得 Swoft 的大量代碼可被重復(fù)使用,而無(wú)需重新加載和重新實(shí)例化,大大提升性能的其中一點(diǎn)原因之一。
這樣的變更對(duì)開(kāi)發(fā)會(huì)造成一定程度的影響,也就是說(shuō)在 Swoft 下,你需要 重啟 Worker 或 重啟服務(wù) 才能使變更的代碼生效,但是得益于 Swoft 的 熱重載 功能,可以自動(dòng)檢查代碼變更并自動(dòng) 重啟 Worker,我們只需通過(guò)項(xiàng)目根目錄下的 .env 文件更改 AUTO_RELOAD 項(xiàng)為 true 即可,如項(xiàng)目根目錄下沒(méi)有 .env 文件,可直接復(fù)制 .env.example 文件為 .env 并作出對(duì)應(yīng)的更改即可,有一點(diǎn)需要注意的是僅在改變 app 目錄下的代碼才會(huì)被 熱重載 功能重載,改變其它代碼不會(huì)被重載,這是由于不同代碼是處于不同的生命周期導(dǎo)致的,僅 WorkerStart 之后加載的代碼才能被重載,關(guān)于這部分的內(nèi)容我們將在后續(xù)涉及到 Swoft 的生命周期 時(shí)再做進(jìn)一步的講解。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29119.html
摘要:所以呢,為了節(jié)省我們的時(shí)間,官方提供了一個(gè)鏡像包,里面包含了運(yùn)行環(huán)境所需要的各項(xiàng)組件我們只需要下載鏡像并新建一個(gè)容器,這個(gè)容器就提供了框架所需的所有依賴和環(huán)境,將宿主機(jī)上的項(xiàng)目掛載到鏡像的工作目錄下,就可以繼續(xù)我們的開(kāi)發(fā)或生產(chǎn)工作了。 Swoft 首個(gè)基于 Swoole 原生協(xié)程的新時(shí)代 PHP 高性能協(xié)程全棧框架,內(nèi)置協(xié)程網(wǎng)絡(luò)服務(wù)器及常用的協(xié)程客戶端,常駐內(nèi)存,不依賴傳統(tǒng)的 PHP-...
摘要:所以呢,為了節(jié)省我們的時(shí)間,官方提供了一個(gè)鏡像包,里面包含了運(yùn)行環(huán)境所需要的各項(xiàng)組件我們只需要下載鏡像并新建一個(gè)容器,這個(gè)容器就提供了框架所需的所有依賴和環(huán)境,將宿主機(jī)上的項(xiàng)目掛載到鏡像的工作目錄下,就可以繼續(xù)我們的開(kāi)發(fā)或生產(chǎn)工作了。 Swoft 首個(gè)基于 Swoole 原生協(xié)程的新時(shí)代 PHP 高性能協(xié)程全棧框架,內(nèi)置協(xié)程網(wǎng)絡(luò)服務(wù)器及常用的協(xié)程客戶端,常駐內(nèi)存,不依賴傳統(tǒng)的 PHP-...
摘要:即異步非阻塞,,事件驅(qū)動(dòng)。優(yōu)雅的注解聲明,容器,嚴(yán)格遵循規(guī)范。鏡像的主要用途官方提供了基于的鏡像。鏡像中已安裝配置好運(yùn)行的所需組件及依賴。修改鏡像的使得容器啟動(dòng)時(shí)不同時(shí)啟動(dòng)服務(wù),這就不需要要求我們掛載的本地項(xiàng)目必須完全安裝好依賴了。 之前有寫(xiě)過(guò)一篇 Docker 安裝部署 Swoft 的文章,但有些冗余混亂,故重寫(xiě)作為教程的開(kāi)篇。要不讀讀看? Swoft項(xiàng)目:https://gith...
摘要:即異步非阻塞,,事件驅(qū)動(dòng)。優(yōu)雅的注解聲明,容器,嚴(yán)格遵循規(guī)范。鏡像的主要用途官方提供了基于的鏡像。鏡像中已安裝配置好運(yùn)行的所需組件及依賴。修改鏡像的使得容器啟動(dòng)時(shí)不同時(shí)啟動(dòng)服務(wù),這就不需要要求我們掛載的本地項(xiàng)目必須完全安裝好依賴了。 之前有寫(xiě)過(guò)一篇 Docker 安裝部署 Swoft 的文章,但有些冗余混亂,故重寫(xiě)作為教程的開(kāi)篇。要不讀讀看? Swoft項(xiàng)目:https://gith...
摘要:官網(wǎng)全站實(shí)踐正式來(lái)襲也迎來(lái)自己的一個(gè)里程碑?dāng)?shù)正式突破官網(wǎng)作為項(xiàng)目組服務(wù)開(kāi)發(fā)者們的重要渠道也迎來(lái)了自己的一次重大更新重構(gòu)升級(jí)到全站實(shí)現(xiàn)本篇先介紹官網(wǎng)全站實(shí)踐先來(lái)一張官網(wǎng)效果圖鎮(zhèn)樓靜態(tài)資源由托管開(kāi)啟業(yè)務(wù)代碼交由執(zhí)行設(shè)置使用協(xié)議要實(shí)現(xiàn)非常簡(jiǎn)單 date: 2018-3-8 13:50:03title: Swoft| Swoft官網(wǎng)全站 HTTP2 實(shí)踐 Swoft1.0正式來(lái)襲, Swoft...
閱讀 2130·2023-04-25 17:48
閱讀 3615·2021-09-22 15:37
閱讀 2960·2021-09-22 15:36
閱讀 6052·2021-09-22 15:06
閱讀 1662·2019-08-30 15:53
閱讀 1456·2019-08-30 15:52
閱讀 736·2019-08-30 13:48
閱讀 1146·2019-08-30 12:44