easy swoole整合inotify.so實現服務熱更新
阿新 • • 發佈:2019-02-01
本文絕逼是樓主自測通過的,自測都不通過的,是不會發上來害人的
首先確認已經安裝好swoole,沒有安裝好的同學可以參考:swoole安裝
下載easy swoole
隨便進入一個目錄就行了,建立目錄並下載:
make easy && cd easy && curl https://www.easyswoole.com/installer.php | php
啟動框架 :php server start
瀏覽器訪問 :http://120.25.226.161:9501/index/index (ip改成你的Ip即可,如果訪問ok那安裝成功,安裝失敗請重複上面操作)
如果安裝了ab工具的話可以試下效能測試,沒安裝的同學可以看下我的另外一篇部落格,具體的引數都有寫的:
ab -n 10000 -c 20 http://120.25.226.161:9501/ 我的單核2g主機內網測試4000+的併發
easy swoole是記憶體框架,就是框架啟動的時候就已經載入檔案到記憶體了,啟動後的所有修改都需要重啟伺服器才能生效,在開發階段,每修改一句話都需要重啟伺服器,這很明顯是不合理的,所以要做熱更新
pcel install inotify
然後把擴充套件加入到php.ini檔案,怎麼新增,跟swoole一樣,飛機票拿走 swoole安裝
同理加上去後重啟 : kill -USR2 php-fpm 的master 程序
注意的是有的同學的php.ini在fast-cgi 模式和cli模式的是不一樣的 :php -i |grep php.ini
php -m |grep swoole
php -m |grep inotify
這兩兄弟躺在裡面的話,下面就加段程式碼進去就行了,飛機票: 熱更新程式碼
#可以將以下程式碼新增到Event.php的onWorkerStart事件中,實現檔案更新後自動reload服務,請確定安裝了inotify拓展
#提醒: 在生產模式上線前一定要注意移除熱重啟,否則可能會造成不可預估的錯誤和異常
//請確定有inotify拓展
if ($workerId == 0) {
// 遞迴獲取所有目錄和檔案
$a = function ($dir) use (&$a) {
$data = array();
if (is_dir($dir)) {
//是目錄的話,先增當前目錄進去
$data [] = $dir;
$files = array_diff(scandir($dir), array('.', '..'));
foreach ($files as $file) {
$data = array_merge($data, $a($dir . "/" . $file));
}
} else {
$data[] = $dir;
}
return $data;
};
$list = $a(ROOT . "/App");
$notify = inotify_init();
// 為所有目錄和檔案新增inotify監視
foreach ($list as $item) {
inotify_add_watch($notify, $item, IN_CREATE | IN_DELETE | IN_MODIFY);
}
// 加入EventLoop
swoole_event_add($notify, function () use ($notify) {
$events = inotify_read($notify);
if (!empty($events)) {
//注意更新多個檔案的間隔時間處理,防止一次更新了10個檔案,重啟了10次,懶得做了,反正原理在這裡
Server::getInstance()->getServer()->reload();
}
});
}
重啟服務,這樣就實現熱更新了,開始你的搬磚旅途吧!!!