[转]FTP搜索引擎的设计与实现

FTP搜索引擎的设计与实现
张运凯 刘宏忠 郭宏刚

  摘要: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<count($n_list);$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 "<font color='FF3399' size=2>".$filename;echo "</font><br>\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信息,表示文件的下载地址。代码结构为:

  <a href=”文件的网络地址”>文件名</a>文件大小和日期
  <a href=”文件的网络地址”>网络地址</a>
  下图为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

来源:http://www.eol.cn/20031023/3093295.shtml

你可能感兴趣的:(设计模式,数据结构,mysql,PHP,搜索引擎)