以前网站搬家一直是使用SSH,tar打包,再SCP到远端的服务器或者从远端服务器上WGET,如果主机都在美国的话,速度快的很,几百M乃至上G的网站很快就可以迁移完毕,但如果主机不支持SSH或者需要另外收费的话,对于一般只在网站搬家时用用SSH的人来说就不太划算了。用过美国主机的人都知道,通过FTP下载回来再传到新服务器上,这简直是不可想象的。

不记得网上在哪里看到的一段代码,实现从远程服务器上拖大文件,很实用:

<form method="post">
<input name="url" size="50" />
<input name="submit" type="submit" />
</form>
<?php
// maximum execution time in seconds
set_time_limit (24 * 60 * 60);
if (!isset($_POST['submit'])) die();
$destination_folder = 'temp/';

$url = $_POST['url'];
$newfname = $destination_folder . basename($url);
$file = fopen ($url, "rb");
if ($file) {
$newf = fopen ($newfname, "wb");
if ($newf)
while(!feof($file)) {
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
}
if ($file) {
fclose($file);
}
if ($newf) {
fclose($newf);
}
?>

这段代码默认是把文件拖到此代码文件所在目录的temp子目录下,temp可以随便改,遵循unix目录规则即可,当然要保证有写的权限
弊端是set_time_limit往往会消耗主机太多的资源,另外如果主机PHP.INI设置的max_execution_time如果太短,也容易导致脚本超时,文件不能被完全下载。

补充:
这个程序用完了记得删除掉,否则谁都可以直接拖文件进去了,或者也可以加个密码,通过cPanel的目录保护或者手动编辑.htaccess都可以,更简单也便于移动的方法是在文件头部加入如下代码:

<?php
$auth = true;           // Set to false to disable authentication
$user = "admin";
$pw = "kuka";
 
if ($auth && (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
        $_SERVER['PHP_AUTH_USER'] != $user || $_SERVER['PHP_AUTH_PW'] != $pw)) {
    header('WWW-Authenticate: Basic realm="Forum Posts Counter"');
    header('HTTP/1.0 401 Unauthorized');
    echo "<h1>Permission denied!<h1>";
    exit;
}
?>

其中$user和$pw分别是用户名和密码,对于安全要求不太高的用这个验证也就可以了。

比较稳妥的办法是利用有SSH权限的机器中转

例如:

  1. 两台服务器A(有SSH权限)和B(无SSH权限),要从A搬迁到B,那么可以在A上 tar zcvf site.tar.gz ~/public_html,然后通过ftp发送到B。
  2. 两台服务器A(无SSH权限)和B(有SSH权限),要从A搬迁到B,那么可以在A上用cPanel的文件管理器进行打包,然后在B上通过wget获取。
  3. 三台服务器A(无SSH权限)和B(无SSH权限)与C(有SSH权限),要从A搬迁到B,那么在A上用cPanel打包,在C上wget过来,再ftp到B上去。