借用php脚本快速实现php站点数据迁移

一个朋友的网站,换web服务器,要我帮忙。朋友的网站原本在我的虚拟主机空间上,但嫌网通访问速度慢,自己买了个比较快一点的。要换的也还是虚拟主机,而且是超简单的那种,只有一个基于web的简单后台,文件管理都很不完善,连zip压缩解压缩的功能没有,也没有直接下载远程文件并解压的功能,更不用说ssh了。对于这样的虚拟主机最怕就是ftp服务器再有问题。

然而最怕的事情还是来了。

经常在虚拟主机上见到微软的msftp,那个烂啊,都没有可以形容的词了。上传或下载文件的过程中,会莫名其妙的连接中断,要重新连接,而且更可恶的是服务器在断开连接时,连个消息都不给,直接断掉了,ftp客户端还在等待服务器上回应,结果是超时,然后客户端才知道是连接断掉了。有时在上传或者下载一个队列时,上传了一个文件,在进行下一个时,提示消息“传输失败”,然后客户会跳过进行再下一下,再下一个......当然也传问是失败。这个最令人无法忍受的事情,只能强制断开ftp客户端,再重新传输队列。十分的没有效率,而且影响心情。这次的问题跟这个类似,但似乎这个服务器不是windows的,它使用的ftp服务器消息中声称是ProFTPD,看来应该是linux,而虚拟主机服务器的管理员能把linux也搞成这样,实在对不起linux. 以前还从来没有见过配置得这么烂的linux + ftpd!

然而骂归骂,事情还是得做。这次迁移的其实一个很小的网站,只有一千多个文件,跟一个mysql数据库。使用filezilla传输,已经设置文件覆盖规则,以免传输一半被服务器单方面断开、而导致文件重传时的“文件覆盖提醒”。但还是实在无法忍受,传了半个小时才传上了200多个文件,失败的队列文件数目已经涨到300多个,看来照这样的速度,要传不知道多久了,还得多次重置失败队列。于 是想需要用另外的方法来实现,而不能使用ftp了。最简单的php,它本身有文件管理的功能,网上有很多基于php的文件管理工具,下载了几个试用,要么功能太差,没有zip功能,或者文件太多,比朋友的这个小网站文件还多。 因为之前搞过一次php写的zip文件解压缩脚本,不过是使用别人写的。而php本身有从外部站点上下载文件的功能,像fopen, file_get_contents等函数都可以很容易实现。那与其找php文件管理工具,还不如写个简单的程序在目标主机上运行。程序非常简单:

<?php
$foo=__FILE__;
$bar=pathinfo($foo);
$file_path=$bar['dirname'].'/xxx.zip';
$data=file_get_contents("http://xxx.path8.net/xxx/xxx.zip");
$foo=file_put_contents($file_path,$data);
var_dump($foo);
?>

我的虚拟主机好歹有个ssh,可以很方便的压缩所有文件,并通过http访问。上面这段php脚本就可以实现从我的网站上通过http访问,并把整站的压缩文件下载到目标主机上(这里要注意目标主机上不否有写入权限,可以把目录设置777,迁移完成后再改回去)。然后,再使用一个zip解压工具,当然也要是php脚本编写的,网上有这个一个,有简单的页面设计,还比较直观,使用也较简单(附于本文后)。把这个工具也传到目标主机上,跟整站zip压缩包放在同一目录下,使用它解压缩zip,非常快,几秒钟就完成了,如果是使用ftp传输,那真不知道还要几个小时才能完成。

基于php的zip文件解压缩工具: unzip.php