2013-10-27 135 views
0

對於我的網站,我需要將一個文件夾從我的VPS上的主帳戶複製到(自動)新創建的cPanel帳戶。我試着用PHP來做到這一點,通過FTP使用下面的代碼(功能):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腳本運行,同時確保它具有從主服務器執行的所有權限。

回答

1

首先,確保您的目標服務器上的目錄是可寫的。臨時將其改爲0777應該有所幫助。你腳本的其餘部分似乎沒問題。您可以嘗試將錯誤記錄設置爲所有錯誤(只需在腳本開始處添加error_reporting(E_ALL);)。然後,PHP應該輸出每個錯誤,警告或通知,這可能會爲您提供更多信息。

+0

感謝您的回覆,但錯誤的東西似乎是他們現在爲我修復的主機/服務器問題(在php.ini配置中)。雖然chmod不是問題,但是我爲ftp遞歸目錄文件上傳創建了我自己的函數,並使其能夠工作! – Skyfe

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); 
     } 
     } 
    } 
    } 

} 

現在剩下的就是確保它適用於大的目錄結構太的唯一的事(沒有一個巨大的加載時)!