1. 程式人生 > >easy swoole整合inotify.so實現服務熱更新

easy swoole整合inotify.so實現服務熱更新

本文絕逼是樓主自測通過的,自測都不通過的,是不會發上來害人的

首先確認已經安裝好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(); } }); }

重啟服務,這樣就實現熱更新了,開始你的搬磚旅途吧!!!