设为首页 收藏本站
查看: 1423|回复: 0

[经验分享] [转]FTP搜索引擎的设计与实现

[复制链接]

尚未签到

发表于 2016-6-9 12:17:39 | 显示全部楼层 |阅读模式
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站点等管理和维护。其结构如下图所示。
http://www.eol.cn/20031023/sousuo102301.gif
  

  我们在设计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.")+[^\\\\]*"."\"".";";
  系统包括两种检索界面,即文件名检索和高级检索。下面是高级检索的界面和功能。
http://www.eol.cn/20031023/sousuo102302.jpg
    在采集到数据库的文件信息中,包括了文件名、大小、日期和文件的网络地址。查询结果可由数据库中的网落地址可生成文件的URL信息,表示文件的下载地址。代码结构为:

  <a href=”文件的网络地址”>文件名</a>文件大小和日期
  <a href=”文件的网络地址”>网络地址</a>
  下图为FTP搜索引擎的输出结果:
http://www.eol.cn/20031023/sousuo102303.jpg
  
  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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-228244-1-1.html 上篇帖子: Java语言实现简单FTP软件------>FTP软件远程窗口的实现(六) 下篇帖子: sun.net.ftp.FtpClient 操作FTP服务器上的文件和目录
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表