學習路之PHP--easyswoole3.3入門及文件熱加載

學習路之PHP--easyswoole入門

  • 一、框架說明
  • 二、常用命令
  • 三、文件熱加載

一、框架說明

  1. 目錄結構
目錄結構
project                   項目部署目錄
├─App                     應用目錄(可以有多個)
│  ├─HttpController       控制器目錄
│  │  └─Index.php         默認控制器
│  └─Model                模型文件目錄
├─Log                     日志文件目錄
├─Temp                    臨時文件目錄
├─vendor                  第三方類庫目錄
├─composer.json           Composer架構
├─composer.lock           Composer鎖定
├─EasySwooleEvent.php     框架全局事件
├─easyswoole              框架管理腳本
├─easyswoole.install      框架安裝鎖定文件
├─dev.php                 開發配置文件
├─produce.php             生產配置文件
————————————————
  1. 生命周期
    在這里插入圖片描述
  2. 配置文件說明 dev.php、produce.php
<?phpreturn ['SERVER_NAME' => "EasySwoole",//服務名'MAIN_SERVER' => ['LISTEN_ADDRESS' => '0.0.0.0',//監聽地址'PORT' => 9501,//監聽端口'SERVER_TYPE' => EASYSWOOLE_WEB_SERVER, //可選為 EASYSWOOLE_SERVER  EASYSWOOLE_WEB_SERVER EASYSWOOLE_WEB_SOCKET_SERVER'SOCK_TYPE' => SWOOLE_TCP,//該配置項當為SERVER_TYPE值為TYPE_SERVER時有效'RUN_MODEL' => SWOOLE_PROCESS,// 默認Server的運行模式'SETTING' => [// Swoole Server的運行配置( 完整配置可見[Swoole文檔](https://wiki.swoole.com/wiki/page/274.html) )'worker_num' => 8,//運行的  worker進程數量'max_request' => 5000,// worker 完成該數量的請求后將退出,防止內存溢出'task_worker_num' => 8,//運行的 task_worker 進程數量'task_max_request' => 1000,// task_worker 完成該數量的請求后將退出,防止內存溢出'reload_async' => true,//設置異步重啟開關。設置為true時,將啟用異步安全重啟特性,Worker進程會等待異步事件完成后再退出。'task_enable_coroutine' => true//開啟后自動在onTask回調中創建協程]],'TEMP_DIR' => null,//臨時文件存放的目錄'LOG_DIR' => null,//日志文件存放的目錄'CONSOLE' => [//console控制臺組件配置'ENABLE' => true,//是否開啟'LISTEN_ADDRESS' => '127.0.0.1',//監聽地址'PORT' => 9500,//監聽端口'USER' => 'root',//驗權用戶名'PASSWORD' => '123456'//驗權用戶名],'FAST_CACHE' => [//fastCache組件'PROCESS_NUM' => 0,//進程數,大于0才開啟'BACKLOG' => 256,//數據隊列緩沖區大小],'DISPLAY_ERROR' => true,//是否開啟錯誤顯示];
  1. 配置操作類

EasySwoole\Config 類

toArray 方法獲取全部配置,load 方法重載全部配置

如果設置了修改,需要更新配置的意思

$instance = \EasySwoole\EasySwoole\Config::getInstance();
// 獲取配置 按層級用點號分隔
$instance->getConf('MAIN_SERVER.SETTING.task_worker_num');
// 設置配置 按層級用點號分隔
$instance->setConf('DATABASE.host', 'localhost');
// 獲取全部配置
$conf = $instance->getConf();
// 用一個數組覆蓋當前配置項
$conf['DATABASE'] = ['host' => '127.0.0.1','port' => 13306
];
$instance->load($conf);

添加用戶配置項

'MYSQL' => ['host' => '192.168.75.1','port' => '3306','user' => 'root','timeout' => '5','charset' => 'utf8mb4','password' => 'root','database' => 'cry','POOL_MAX_NUM' => '20','POOL_TIME_OUT' => '0.1',
],
/*################ REDIS CONFIG ##################*/
'REDIS' => ['host' => '127.0.0.1','port' => '6379','auth' => '','POOL_MAX_NUM' => '20','POOL_MIN_NUM' => '5','POOL_TIME_OUT' => '0.1',
],

二、常用命令

install 安裝easySwoole
start 啟動easySwoole
stop 停止easySwoole(守護模式下使用)
reload 熱重啟easySwoole(守護模式下使用)
restart 重啟easySwoole(守護模式下使用)

守護模式啟動:

php easyswoole start d 

線上:

php easyswoole start produce

停止:

php easyswoole stop 

重啟服務:

php easyswoole reload 只重啟task進程
php easyswoole reload all  重啟task + worker進程 文件熱加載

生產與開發配置分離:
默認為開發模式,加載 dev.php
生產模式加載 produce.php

php easyswoole start produce

查看啟動情況:

bash netstat -tunlp | grep 9501
可以看到結果:
bash tcp 0 0 0.0.0.0:9501 0.0.0.0:* LISTEN 4015/EasySwoole
kill 4015 //普通關閉進程
kill -9 4015 //強制關閉進程

三、文件熱加載

由于 swoole 常駐內存的特性,修改文件后需要重啟worker進程才能將被修改的文件重新載入內存中

解決:Process的方式實現文件變動自動進行服務重載

  1. 新建文件 App/Process/HotReload.php 并添加如下內容,也可以放在其他位置,請對應命名空間
<?phpnamespace App\Process;use EasySwoole\Component\Process\AbstractProcess;
use EasySwoole\EasySwoole\ServerManager;
use EasySwoole\Utility\File;
use Swoole\Process;
use Swoole\Table;
use Swoole\Timer;/*** 暴力熱重載* Class HotReload* @package App\Process*/
class HotReload extends AbstractProcess
{/** @var \swoole_table $table */protected $table;protected $isReady = false;protected $monitorDir; // 需要監控的目錄protected $monitorExt; // 需要監控的后綴/*** 啟動定時器進行循環掃描*/public function run($arg){// 此處指定需要監視的目錄 建議只監視App目錄下的文件變更$this->monitorDir = !empty($arg['monitorDir']) ? $arg['monitorDir'] : EASYSWOOLE_ROOT . '/App';// 指定需要監控的擴展名 不屬于指定類型的的文件 無視變更 不重啟$this->monitorExt = !empty($arg['monitorExt']) && is_array($arg['monitorExt']) ? $arg['monitorExt'] : ['php'];if (extension_loaded('inotify') && empty($arg['disableInotify'])) {// 擴展可用 優先使用擴展進行處理$this->registerInotifyEvent();echo "server hot reload start : use inotify\n";} else {// 擴展不可用時 進行暴力掃描$this->table = new Table(512);$this->table->column('mtime', Table::TYPE_INT, 4);$this->table->create();$this->runComparison();Timer::tick(1000, function () {$this->runComparison();});echo "server hot reload start : use timer tick comparison\n";}}/*** 掃描文件變更*/private function runComparison(){$startTime = microtime(true);$doReload = false;$dirIterator = new \RecursiveDirectoryIterator($this->monitorDir);$iterator = new \RecursiveIteratorIterator($dirIterator);$inodeList = array();// 迭代目錄全部文件進行檢查foreach ($iterator as $file) {/** @var \SplFileInfo $file */$ext = $file->getExtension();if (!in_array($ext, $this->monitorExt)) {continue; // 只檢查指定類型} else {// 由于修改文件名稱 并不需要重新載入 可以基于inode進行監控$inode = $file->getInode();$mtime = $file->getMTime();array_push($inodeList, $inode);if (!$this->table->exist($inode)) {// 新建文件或修改文件 變更了inode$this->table->set($inode, ['mtime' => $mtime]);$doReload = true;} else {// 修改文件 但未發生inode變更$oldTime = $this->table->get($inode)['mtime'];if ($oldTime != $mtime) {$this->table->set($inode, ['mtime' => $mtime]);$doReload = true;}}}}foreach ($this->table as $inode => $value) {// 迭代table尋找需要刪除的inodeif (!in_array(intval($inode), $inodeList)) {$this->table->del($inode);$doReload = true;}}if ($doReload) {$count = $this->table->count();$time = date('Y-m-d H:i:s');$usage = round(microtime(true) - $startTime, 3);if (!$this->isReady == false) {// 監測到需要進行熱重啟echo "severReload at {$time} use : {$usage} s total: {$count} files\n";ServerManager::getInstance()->getSwooleServer()->reload();} else {// 首次掃描不需要進行重啟操作echo "hot reload ready at {$time} use : {$usage} s total: {$count} files\n";$this->isReady = true;}}}/*** 注冊Inotify監聽事件*/private function registerInotifyEvent(){// 因為進程獨立 且當前是自定義進程 全局變量只有該進程使用// 在確定不會造成污染的情況下 也可以合理使用全局變量global $lastReloadTime;global $inotifyResource;$lastReloadTime = 0;$files = File::scanDirectory(EASYSWOOLE_ROOT . '/App');$files = array_merge($files['files'], $files['dirs']);$inotifyResource = inotify_init();// 為當前所有的目錄和文件添加事件監聽foreach ($files as $item) {inotify_add_watch($inotifyResource, $item, IN_CREATE | IN_DELETE | IN_MODIFY);}// 加入事件循環swoole_event_add($inotifyResource, function () {global $lastReloadTime;global $inotifyResource;$events = inotify_read($inotifyResource);if ($lastReloadTime < time() && !empty($events)) { // 限制1s內不能進行重復reload$lastReloadTime = time();ServerManager::getInstance()->getSwooleServer()->reload();}});}public function onShutDown(){// TODO: Implement onShutDown() method.}public function onReceive(string $str){// TODO: Implement onReceive() method.}
}
  1. 添加好后在全局的 EasySwooleEvent.php 中,注冊該自定義進程
	use App\Process\HotReload;********************public static function mainServerCreate(EventRegister $register){// TODO: Implement mainServerCreate() method.$swooleServer = ServerManager::getInstance()->getSwooleServer();$swooleServer->addProcess((new HotReload('HotReload', ['disableInotify' => false]))->getProcess());}
  1. 效果
    修改:easyswoole\App\HttpController\Index.php
$this->response()->write('hello2');

不需要重起easyswoole 直接訪問就有效果
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907355.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907355.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式26——解釋器模式

寫文章的初心主要是用來幫助自己快速的回憶這個模式該怎么用&#xff0c;主要是下面的UML圖可以起到大作用&#xff0c;在你學習過一遍以后可能會遺忘&#xff0c;忘記了不要緊&#xff0c;只要看一眼UML圖就能想起來了。同時也請大家多多指教。 解釋器模式&#xff08;Interp…

第三屆寧波技能大賽網絡安全賽項樣題

2025 第三屆寧波技能大賽網絡安全賽項樣題 模塊A: 網絡安全事件響應、數字取證調查和應用安全任務一:應急響應任務二:操作系統取證任務三:網絡數據包分析任務四:代碼審計 模塊B:CTF 奪旗-攻擊模塊C:CTF 奪旗-防御需要環境培訓可以私信博主&#xff01;&#xff01;&#xff01;…

GO語言進階:掌握進程OS操作與高效編碼數據轉換

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦&#xff1a;「storms…

IO進程(進程 Process)

什么是進程&#xff1f; 1.概念 程序&#xff1a;編譯好的可執行文件&#xff0c;存放在磁盤上的指令和數據的有序集合。 由此可見程序是靜態的&#xff0c;沒有執行的概念。 進程&#xff1a;是程序的一次執行的過程&#xff0c;是一個可調度的任務&#xff0c;也是執行一…

CSS傳統布局與定位詳解與TDK三大標簽SEO優化

一、傳統布局基礎 1. 文檔流布局 瀏覽器默認的文檔流布局方式遵循以下規則&#xff1a; 塊級元素&#xff08;如<div>、<p>、<h1>&#xff09;&#xff1a; 獨占一行寬度默認100%可以設置寬高、內外邊距 div {width: 500px;height: 200px;margin: 10px …

【GraphQL】深入解析 Apollo Client:從架構到實踐的一站式 GraphQL 解決方案

深入解析 Apollo Client&#xff1a;從架構到實踐的一站式 GraphQL 解決方案 1. 引言 GraphQL 作為現代 API 開發的核心技術&#xff0c;其靈活性和高效性正在重塑數據交互模式。Apollo Client 作為 GraphQL 生態中最受歡迎的客戶端庫&#xff0c;憑借強大的緩存機制、框架集…

docker學習基本使用教程

docker是一款用于開發部署和運行容器化平臺&#xff0c;能將應用及其依賴打包成輕量級、可移植的容器&#xff0c;實現一次構建&#xff0c;隨處運行。docker是cs架構程序&#xff08;客戶端和服務端&#xff09;&#xff0c;docker客戶端向docker守護進程發送請求&#xff0c;…

萬字詳解RTR RTSP SDP RTCP

目錄 1 RTSP1.1 RTSP基本簡介1.2 RSTP架構1.3 重點內容分析 2 RTR2.1 RTR簡介2.2 RTP 封裝 H.2642.3 RTP 解封裝 H.2642.4 RTP封裝 AAC2.5 RTP解封裝AAC 3 SDP3.1 基礎概念3.2 SDP協議示例解析3.3 重點知識 4 RTCP4.1 RTCP基礎概念4.2 重點 5 總結 1 RTSP 1.1 RTSP基本簡介 一…

唯一原生適配鴻蒙電腦的遠程控制應用,向日葵正式上線

近日&#xff0c;華為正式發布鴻蒙電腦新品&#xff0c;標志著HarmonyOS在PC端生態的進一步拓展。作為遠程控制領域的先行者&#xff0c;貝銳科技旗下的向日葵遠程控制軟件也在第一時間完成了對鴻蒙電腦系統的原生適配&#xff0c;并已正式上線華為鴻蒙電腦應用市場&#xff0c…

vue2中,codemirror編輯器的使用

交互說明 在編輯器中輸入{時&#xff0c;會自動彈出選項彈窗&#xff0c;然后可以選值插入。 代碼 父組件 <variable-editorv-model"content":variables"variables"placeholder"請輸入模板內容..."blur"handleBlur" />data…

Kafka自定義分區策略實戰避坑指南

文章目錄 概要代碼示例小結 概要 kafka生產者發送消息默認根據總分區數和設置的key計算哈希取余數&#xff0c;key不變就默認存放在一個分區&#xff0c;沒有key則隨機數分區&#xff0c;明顯默認的是最不好用的&#xff0c;那kafka也提供了一個輪詢分區策略&#xff0c;我自己…

WPF 全屏顯示實現(無標題欄按鈕 + 自定義退出按鈕)

WPF 全屏顯示實現&#xff08;無標題欄按鈕 自定義退出按鈕&#xff09; 完整實現代碼 MainWindow.xaml <Window x:Class"FullScreenApp.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas…

sqli_labs第二十九/三十/三十一關——hpp注入

一&#xff1a;HTTP參數污染&#xff1a; hpp&#xff08;http parameter pollution)注入中&#xff0c;可以通過在hppt的請求中注入多個同名參數來繞過安全過濾 原理&#xff1a;php默認只取最后一個同名參數 比如在這一關里&#xff0c;可能對第一個id參數進行消毒處理&a…

【STM32】按鍵控制LED 光敏傳感器控制蜂鳴器

&#x1f50e;【博主簡介】&#x1f50e; &#x1f3c5;CSDN博客專家 &#x1f3c5;2021年博客之星物聯網與嵌入式開發TOP5 &#x1f3c5;2022年博客之星物聯網與嵌入式開發TOP4 &#x1f3c5;2021年2022年C站百大博主 &#x1f3c5;華為云開發…

華為OD機試真題——斗地主之順子(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 B卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

Qt找不到windows API報錯:error: LNK2019: 無法解析的外部符號 __imp_OpenClipboard

筆者在開發中出現的bug完整報錯如下&#xff1a; spcm_ostools_win.obj:-1: error: LNK2019: 無法解析的外部符號 __imp_OpenClipboard&#xff0c;函數 "void __cdecl spcmdrv::vCopyToClipboard(char const *,unsigned __int64)" (?vCopyToClipboardspcmdrvYAXPE…

4.8.4 利用Spark SQL實現分組排行榜

在本次實戰中&#xff0c;我們的目標是利用Spark SQL實現分組排行榜&#xff0c;特別是計算每個學生分數最高的前3個成績。任務的原始數據由一組學生成績組成&#xff0c;每個學生可能有多個成績記錄。我們首先將這些數據讀入Spark DataFrame&#xff0c;然后按學生姓名分組&am…

[PyMySQL]

掌握pymysql對數據庫實現增刪改查數據庫工具類封裝,數據庫操作應用場景數據庫操作應用場景 校驗測試數據 : 刪除員工 :構造測試數據 : 測試數據使用一次就失效,不能重復使用 : 添加員工(is_delete)測試數據在展開測試前無法確定是否存在 : 查詢,修改,刪除員工操作步驟:!~~~~~~~…

cs224w課程學習筆記-第12課

cs224w課程學習筆記-第12課 知識圖譜問答 前言一、問答類型分類二、路徑查詢(Path queries)2.1 直觀查詢方法2.2 TransE 擴展2.3 TransE 能力分析 三、連詞查詢(conjunctive queries)3.1 Query2box 原理1)、投影2)、交集查詢&#xff08;AND 操作)3)、聯合查詢&#xff08;OR 操…

AI任務相關解決方案2-基于WOA-CNN-BIGRU-Transformer模型解決光纖通信中的非線性問題

文章目錄 1. 項目背景與研究意義1.1 光纖通信中的非線性問題1.2 神經網絡在光纖非線性補償中的應用現狀 2. 現有模型 CNN-BIGRU-attention 分析2.1 模型架構與工作原理2.2 模型性能評估與局限性 3. 新模型優化方案3.1 WOA算法原理與優勢3.2 WOA-CNN-BIGRU-MHA模型構建3.3 WOA-C…