| 摘要:FTP是因特網最主要的服務之一,FTP搜索引擎為人們使用FTP服務提供了很大的方便。本文分析和設計了一個基于WEB的FTP搜索引擎,并在PHP+Mysql環境下給出了編程實現方法。
關鍵詞:FTP;搜索引擎;PHP;Mysql;
引言
FTP是因特網最主要的服務之一,在FTP服務器上保存有大量的各種各樣的共享軟件、技術資料和多媒體數據等文件。因為每個FTP服務器都有若干個目錄,其目錄和文件結構比較復雜,要在FTP服務器上找到自己需要的文件不是一件容易的事情,要在多個FTP服務器上查找文件更是困難。基于WWW的FTP搜索引擎可以很好的解決上述問題。目前,國內外有很多FTP搜索引擎,國內較著名的有北大天網、百合谷搜索和FTP星空搜索等。為了更好的為我校校園用戶和省主節點用戶提供服務,我們設計了自己的FTP服務器搜索引擎。
1.FTP搜索引擎的結構
FTP搜索引擎由數據采集、數據查詢和站點維護等模塊組成。實現一個FTP搜索引擎,首先要收集各個FTP站點上的文件信息,并把這些信息存儲到數據庫中;然后給用戶提供一個查詢界面,以收取用戶要查詢的信息,把這些查詢信息轉化為數據庫語言,并進行數據庫查詢,把查詢結果以友好的界面顯示給用戶;搜索引擎建立好以后,為了使數據庫數據與FTP站點的數據保持一致,需要更新FTP站點的文件信息,添加新的FTP站點等管理和維護。其結構如下圖所示。
我們在設計FTP搜索引擎時,采用Linux操作系統Redhat8.0,WWW服務器采用Apache,數據庫采用MySQL,編程語言采用PHP。
2. 數據庫結構和設置
2.1文件信息分析
在FTP站點上,根目錄下的目錄中又有許多文件夾和文件,每一個文件的信息包括文件名,文件地址,文件大小,日期,類型等。對應這些文件信息,在文件數據庫中設置相應的字段,用來紀錄這些信息,用字段name存儲文件名,一般不超過255個字符,設置為varchar類型,長度為255,host表示FTP網站的名稱,說明是哪一個網站上的文件,address字段準確給出文件的URL地址,由于有些文件URL比較長,把address字段類型設置為longtext,有了這些字段,就可以在網絡中找到此文件的位置。另外,還需要紀錄下文件的大小,時間,日期,以供用戶分辨選擇他們所要的文件。最后,查詢時對文件名字段的訪問比較頻繁,把它設置成Index字段,這樣可以提高查詢速度。
2.2 FTP站點信息分析
一個FTP站點通常包含服務器名稱,用戶名,和密碼。對應FTP站點的信息,數據字段設置如下:設置站點名、站點IP地址、用戶名、用戶密碼等幾個字段,站點名字段類型為vchar,長度為60,IP地址vchar類型,長度為50,用戶名vchar類型,長度50,密碼設置為password類型,長度為60。另外,FTP站點名也是使用較為頻繁的數據,把它設置為Index字段。
2.3數據庫結構設置
基于以上分析,設置數據庫如下:在file_address數據庫中有兩個數據表,一個為fileaddress數據表,另一個為ftpserver數據表,其中fileaddress數據表用于記錄ftp站點的文件信息,ftpserver數據表用于記錄各個ftp站點的信息。
3. 數據采集
要構建搜索引擎,首先要收集各個FTP站點的文件信息,記錄到數據庫,用于提供搜索。因特網中有許多的FTP站點,要收集某個FTP站點的信息時,從數據表中讀出站點信息,然后登陸到此站點,多數FTP服務器都開辟有一個公共訪問區,稱為"匿名FTP",對公眾提供免費的文件信息服務,一般用戶名為Anonymous,密碼為一個Email地址。數據采集程序用此用戶名和密碼登陸站點,然后對站點所有目錄進行采集,讀取每個目錄下的文件信息,在收到文件信息之后,對其進行分析,將文件信息存儲到相應的數據表字段中。完成此站點的數據采集之后,再讀取另外一個FTP站點的信息,進行文件信息采集。如此循環,采集所有已知FTP站點的文件信息。
首先連接到此ftp站點,并用相應的用戶名和密碼登陸,此時,當前目錄一般為根目錄,有的并不是,所以要先取得當前目錄,然后從此目錄開始掃描此站點的文件信息,如果此目錄為空(只有兩個文件:.和..),則此站點沒有文件,退出登陸,如果不為空,則判斷每個文件是否是目錄,如果是,則改變當前目錄到此子目錄下,掃描此子目錄并判斷,如果還有子目錄,則繼續轉到其下掃描。下面是采集數據的程序。
get_ftp_info() { ftp_connect() /*連接FTP站點; ftp_login() /*登陸FTP站點; ftp_pwd() /*取得當前目錄; get_path_info() /*調用get_path_info()處理此目錄; ftp_quit() /*退出登陸; }
get_path_info()是采集程序最主要函數,該函數采用遞歸調用的方法依次處理各個目錄和文件,把目錄和文件信息寫入數據庫。下面是該函數的實現代碼。
get_path_info() { ftp_rawlist() /*讀取目錄信息; if(dir_is_empty) /*如果目錄為空則返回 retrun;: For() { get_path_info() /*遞歸調用函數get_path_info(), } } //--------------------------------------------------- function get_path_info($ftpserver,$ftplink,$ftp_dir,$sqlmasterlink){ mysql_query("use fileaddress",$sqlmasterlink); $n_list=ftp_rawlist($ftplink,$ftp_dir); //$n_list can not be setted as a global var. if((count($n_list))<=2) return; //at least: one is .. another is . for($i=0;$i $filetype=substr($n_list[$i],0,1); $filename=substr($n_list[$i],55); $filesize=substr($n_list[$i],29,41); switch($filetype){ case "-": { $temp="ftp://".$ftpserver.$ftp_dir."/".$filename; //$temp=$ftp_dir."/".$filename; $filesize=(integer)($filesize/1024); $date=ftp_mdtm($ftplink,$filename); $date=(date("Y")."-".date("m")."-".date("d")); $time=date("H:i:s"); $pieces=explode(".",$filename); $extend=$pieces[count($pieces)-1]; $query="INSERT INTO fileaddress VALUES ( '$filename','$ftpserver','$temp', '$date','$time','$filesize','$extend');"; mysql_query($query,$sqlmasterlink); echo "".$filename;echo " /n"; break; } case "d": { if(($filename!="..")&&($filename!=".")){ ftp_chdir($ftplink,$filename); $ftp_dir=ftp_pwd($ftplink); get_path_info($ftpserver,$ftplink,$ftp_dir,$sqlmasterlink); ftp_chdir($ftplink,".."); } break; } } //end of switch } //end of for } //the end of functon get_path_info() //------------------------------------------------
4. 數據查詢
數據查詢主要包括查詢頁面的設計、查詢程序的編寫和查詢結果的處理及部分。查詢頁面由Web服務器提供查詢界面,用于收集所要查找的文件信息,用戶瀏覽到此Web頁面,填寫并提交表單,表單中包含有用戶所要查找文件的信息,如文件名,大小,等,表單提交給Web服務器之后,由查詢程序進行分析,生成查詢語句,并提交給數據庫服務器進行查詢,查詢結果由查詢程序進行分析處理,查詢結果以超鏈接形式生成Web頁面,提供給用戶瀏覽。
用戶輸入的信息轉化為數據庫查詢語言,再進行查詢。可以用Mysql數據庫查詢語言中給出的正則表達式來表示。其常用表示方法如下:
a.特殊字符"^": 用來匹配以指定字符串開頭的字符串。例如:"^hello" :這個模式與字符串"hello,PHP world!"匹配,但是與"Say hello to you"不匹配。
b.特殊字符"$": 用來匹配以指定字符串結尾的字符串。例如: "you$" :這個模式與"How are you"匹配,與"your"不匹配。
c.當特殊字符"^"和"$"同時使用時,表示精確匹配。例如: "^hello$" :這個模式只匹配字符串"hello"。
在查找文件時,設置表示用戶輸入的文件名的變量為$filename,那么,可以生成如下的查詢語句進行查詢: $sql="select * from $dbtablename where name REGEXP /"[^]*(".$qfilename.")+[^]*"."/"".";"; 系統包括兩種檢索界面,即文件名檢索和高級檢索。下面是高級檢索的界面和功能。 在采集到數據庫的文件信息中,包括了文件名、大小、日期和文件的網絡地址。查詢結果可由數據庫中的網落地址可生成文件的URL信息,表示文件的下載地址。代碼結構為:
文件名文件大小和日期 網絡地址 下圖為FTP搜索引擎的輸出結果: 5. 管理與維護
搜索引擎建立好以后,為了使數據庫數據與FTP站點的數據保持一致,需要對站點進行管理和維護。在我們的設計中,管理和維護功能包括增加FTP站點、顯示及刪除FTP站點、更改FTP站點等功能。為了實現站點文件信息自動更新的功能,我們把更新FTP站點文件信息的程序(addallinfo.php)設置成系統計劃任務,例如可以設置成每天運行一次。
6.結束語
我們設計的FTP搜索引擎已經在網站上使用,為用戶提供了很好的服務。FTP搜索引擎的技術發展很快,在查詢方式、檢索結果處理和分類檢索等方面有了很大的改進。我們將在這幾方面繼續完善我們的系統。 參考文獻:
1. 龍浩等,《PHP語言進階和高級應用》.北京:清華大學出版社出版, 年。 2.鐘偉財,《精通PHP4.0與MySQL架構Web數據庫實務》。北京:中國青年出版社出版, 3.彭武興,《PHP 4完全中文手冊》 4.晏子譯,Mysql中文參考手冊 5.Stig S?ther Bakken ,《PHP Manual》,2003 7.MySQL Reference Manual for version 4.0.5, http://www.mysql.com/documentation/ 8.MySQL Reference Manual,http://www.mysql.com/doc/en/index.html |