PHP FTP复制目录递归

时间:2013-10-27 14:32:09

标签: php ftp cpanel

对于我的网站,我需要将一个文件夹从我的VPS上的主帐户复制到(自动)新创建的cPanel帐户。我尝试使用PHP,通过FTP使用以下代码(函数):

function ftp_sync ($dir) { 
    global $conn_id;

    if ($dir != ".") { 
            if (ftp_chdir($conn_id, $dir) == false) { 
                echo ("Change Dir Failed: $dir<BR>\r\n"); 
                return; 
            } 
            if (!(is_dir($dir))) 
                mkdir($dir); 
        chdir ($dir); 
    } 

        $contents = ftp_nlist($conn_id, "."); 
    foreach ($contents as $file) { 

            if ($file == '.' || $file == '..') 
            continue; 

            if (@ftp_chdir($conn_id, $file)) { 
                    ftp_chdir ($conn_id, ".."); 
                    ftp_sync ($file); 
        } 
            else 
            ftp_get($conn_id, $file, $file, FTP_BINARY); 
        }
    }

    foreach (glob("*") as $file)
    {
        if(substr_count($file, ".") > 0)
        {
            $source_file = $file;
            $destination_file = $file;
            $upload = ftp_put($conn_id, "public_html/".$destination_file, $source_file, FTP_BINARY);
            echo "<br />";
            // check upload status
            if (!$upload) { 
                echo "FTP upload has failed!";
            } else {
                echo "Uploaded $source_file to $ftp_server as $destination_file";
            }
        }else{
            ftp_sync($dir);
        }
    } 


    ftp_chdir ($conn_id, "..");
        chdir ("..");  

} 

然而它似乎不起作用(没有创建和上传新目录)...有谁知道为什么这不起作用以及我如何使它工作?

提前致谢!

最诚挚的问候, Skyfe。

编辑:我忘了提到我将脚本作为cronjob脚本运行,同时确保它具有从主服务器执行的所有权限。

2 个答案:

答案 0 :(得分:1)

首先,确保目标服务器上的目录是可写的。临时chmodding它到0777应该有所帮助。你的其余部分似乎没问题。您可以尝试将错误记录设置为所有错误(只需在脚本开头添加error_reporting(E_ALL);)。然后,PHP应输出每个错误,警告或通知,这可能会为您提供更多信息。

答案 1 :(得分:0)

没有让这个功能起作用,所以我以自己的方式重新创建它并使其正常工作!

...
ftp_mkdir($conn_id, "public_html/".$dir);
ftp_upload($dir);

// close the FTP stream 
ftp_close($conn_id); 

function ftp_upload($dir) {
    global $conn_id;
    if($handle = opendir($dir))
    {
    while(false !== ($file = readdir($handle)))
    {
        if($file != "." && $file != ".." && $file != "...") {
        if(substr_count($file, ".") > 0)
        {
            $full_dir = "public_html/".$dir;
            $source_file = $file;
            $destination_file = $file;
            $upload = ftp_put($conn_id, $full_dir."/".$destination_file, $dir."/".$source_file, FTP_BINARY);
            echo "<br />";
            // check upload status
            if (!$upload) { 
                echo "FTP upload has failed!"; 
            } else {
                echo "Uploaded ".$source_file." to ".$ftp_server." as ".$destination_file; 
            }
        }else{
            ftp_mkdir($conn_id, "public_html/".$dir."/".$file);
            ftp_upload($dir."/".$file);
        }
        }
    }   
    }

}

现在唯一剩下的就是确保它也适用于大型目录结构(没有巨大的加载时间)!