最近開發中遇到了一個問題,多我的使用同一個測試機,又是同一時間開發
,這樣就不能用git去更新代碼了,你要更新了代碼別人的功能就被你覆蓋了,
而一個取而代之的方法是經過rz
同步代碼文件,但這效率過低了,並且有可
能複製錯。php
恰好以前作過fe開發,使用過百度的fisp,他的一個很重要的功能就是代碼發
布,因而沿着這個思路作出了這個工具。html
這裏面最大的問題就是解決如何監控文件了,成百上千的文件、文件夾如何高效的監控,
我首先想到的仍是php有沒有這樣的擴展,果不其然,找到了一個擴展類庫inotify
,
他有inotify_*()
5個函數,可是功能太弱了讓我大失所望,不能遞歸監控文
件夾,只能放棄使用php實現這個功能了。linux
沿着最開始的路線inotify
繼續探索,找到了linux下面的命令inotify-tools
,這個工具的功能就比較強大了,能夠遞歸的監測文件夾及其子文件夾下面的文件
,因而就用shell實現了一個文件監控同步工具,預知具體細節,請繼續往下看,
問題一個個的解決nginx
這個借鑑了fisp
的設計,在服務器上邊放一個接受文件的腳本,經過http的方式
將文件和要保存的地方發送給腳本,腳本進行保存,而後返回結果。git
這個方法的優勢很明顯:在互聯網公司,web服務通常都是有部署的,直接將腳本放上去
配置好目錄權限,就能夠用了,簡單方便。github
下面是服務端腳本的php代碼web
<?php @error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING); function mkdirs($path, $mod = 0777) { if (is_dir($path)) { return chmod($path, $mod); } else { $old = umask(0); if(mkdir($path, $mod, true) && is_dir($path)){ umask($old); return true; } else { umask($old); } } return false; } if($_POST['to']){ $to = urldecode($_POST['to']); if(is_dir($to) || $_FILES["file"]["error"] > 0){ header("Status: 500 Internal Server Error"); } else { if(file_exists($to)){ unlink($to); } else { $dir = dirname($to); if(!file_exists($dir)){ mkdirs($dir); } } echo move_uploaded_file($_FILES["file"]["tmp_name"], $to) ? 0 : 1; } } else { echo 'I\'m ready for that, you know.'; }
監控也有了,上傳文件也有了,接下來就是具體的實現了:shell
在使用以前必定要確保安裝了inotify-tools
,監控依賴於這個軟件中inotifywait
功能,
通常能夠直接使用yum install inotify-tools
安裝該軟件數組
我使用的一個小例子,首先必須能存在的是配置文件,config.sh
服務器
declare -A paths uploads paths[actions]=/usr/local/nginx/html/actions/ paths[controllers]=/usr/local/nginx/html/controllers/ uploads[test1]="http://10.211.55.3/receiver.php" uploads[test2]="http://10.211.55.3/receiver.php"
paths數組的鍵值定義了監控的文件夾名稱,uploads定義了發佈的服務器名稱和地址
使用示例
命令 -d | --dest-server
是指定服務器名稱,後邊的發佈就會發布到該服務器,-a | --all
會將全部的文件發佈一邊,-w | --watch
會監控全部的文件,有改動進行發佈,-h | --help
是查看幫助
watch-callback-file
歡迎一塊兒改進優化