jump to navigation

FTP?索引擎的设计与实现zz 十二月 22, 2005

Posted by wayhome in 技术?谈.
trackback

摘?: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 xhref=”文件的网络地?” mce_href=”文件的网络地?”>文件??</a>文件大?和日期
<a xhref=”文件的网络地?” mce_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

Technorati :

评论»

No comments yet — be the first.