2012-06-01 84 views
6

我不斷對我的軟件進行調整並上傳到服務器。正如我有客戶一直在使用我的在線軟件,如果客戶點擊一個鏈接(比如1秒),PHP文件部分上傳(假設上傳需要3秒鐘),他們會得到一個錯誤,因爲該文件仍在上傳...上傳文件時不會導致服務器端錯誤

Parse error: syntax error, unexpected $end in /inc/functions.php on line 475 

因爲我在澳大利亞,我們的互聯網......以及......「不是很快」是一種很好的方式。

上傳文件時是否使用了任何技術,以避免使用該軟件的客戶產生錯誤?

我唯一能做的就是上傳文件來說另一個目錄,然後運行一個PHP腳本,通過超級快速複製文件...但是有更好的解決方案嗎?

最終代碼

由於格雷格下面我就能夠弄清楚做事情的最好方法。以爲我會分享我的最終代碼。這是一個有點粗糙,但不會把戲......希望這可以幫助別人

<?php 

// root path 
define('ABSPATH', dirname(__FILE__) . '/'); 

// messages 
$GLOBALS['copied'] = array(); 
$GLOBALS['failed'] = array(); 
$GLOBALS['folders'] = array(); 

// you have to submit the form (added security) 
if (isset($_POST['copy'])) { 

    $GLOBALS['devuploads_folder'] = '_devuploads'; 

    function find_files($dir) { 
     if ($dh = opendir(ABSPATH . $dir)) { 
      while (($file = readdir($dh)) !== false) { 

       // ignore files 
       if ($file === '.' || $file === '..') 
        continue; 

       // delete temporary files (optional) 
       if ($file == '.DS_Store') { 
        unlink(ABSPATH . $dir . $file); 
        continue; 
       } 

       // determine paths     
       $live_path = str_replace($GLOBALS['devuploads_folder'] . '/', '', $dir . $file);     
       $dev_file = $dir . $file;     
       $live_file = $live_path; 
       $dev_file_path = ABSPATH . $dir . $file;      
       $live_file_path = ABSPATH . $live_path; 

       // it's a file 
       if (is_file(ABSPATH . $dir . $file)) { 

        // check if the file has been updated or it's a brand newy 
        $updated_file = $new_file = false; 
        if (file_exists($live_file_path)) {         
         $dev_file_modified = filemtime($dev_file_path);  
         $live_file_modified = filemtime($live_file_path);            
         if ($dev_file_modified > $live_file_modified) 
          $updated_file = true;      
        } else { 
         $new_file = true; 
        } 

        // move the file 
        if ($updated_file || $new_file) { 
         if (copy($dev_file_path, $dev_file_path . '.bak')) { 
          if (rename($dev_file_path . '.bak', $live_file_path)) 
           if ($new_file) 
            $GLOBALS['copied'][] = '<strong>New File:</strong> ' . $dev_file . ' moved to ' . $live_file; 
           else 
            $GLOBALS['copied'][] = $dev_file . ' moved to ' . $live_file; 
          else 
           $GLOBALS['failed'][] = '<strong>Rename failed:</strong> ' . $dev_file . ' to ' . $live_file; 
         } else { 
          $GLOBALS['failed'][] = '<strong>Copy failed:</strong> ' . $dev_file . ' to ' . $dev_file . '.bak'; 
         } 
        } 

       // it's a folder 
       } else if (is_dir(ABSPATH . $dir . $file)) { 

        // create new folder if it doesn't exist 
        if (!is_dir($live_file_path)) { 
         $GLOBALS['folders'][] = '<strong>Created:</strong> ' . $live_file; 
         mkdir($live_file_path, 0755); 
        } 

        // keep digging 
        find_files($dir . $file . '/'); 

       } 

      } 
      closedir($dh); 
     } 
    } 

    find_files($GLOBALS['devuploads_folder'] . '/'); 

} 

?> 
<!DOCTYPE HTML> 
<html> 
<head> 
    <title>Copy Changes</title> 
    <style type="text/css"> 
    h1 { 
     font: normal 20px Arial, Helvetica, sans-serif; 
     line-height: 24px; 
     } 
    p, li { 
     font: normal 14px Arial, Helvetica, sans-serif; 
     line-height: 20px; 
     } 
    </style> 
</head> 
<body> 

<?php 
if (!empty($GLOBALS['failed'])) { 
    echo '<h1>Errors</h1>'; 
    echo '<ul>'; 
    foreach($GLOBALS['failed'] AS $message) { 
     echo '<li>' . $message . '</li>'; 
    } 
    echo '</ul>'; 
} 

if (!empty($GLOBALS['folders'])) { 
    echo '<h1>New Folders</h1>'; 
    echo '<ul>'; 
    foreach($GLOBALS['folders'] AS $message) { 
     echo '<li>' . $message . '</li>'; 
    } 
    echo '</ul>'; 
} 

if (!empty($GLOBALS['copied'])) { 
    echo '<h1>Copied</h1>'; 
    echo '<ul>'; 
    foreach($GLOBALS['copied'] AS $message) { 
     echo '<li>' . $message . '</li>'; 
    } 
    echo '</ul>'; 
} 

if (empty($GLOBALS['failed']) && empty($GLOBALS['folders']) && empty($GLOBALS['copied'])) 
    echo '<p>No updates made.</p>'; 
?> 

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
<input type="hidden" name="copy" value="1" /> 
<p><input type="submit" value="Copy Files" /></p> 
</form> 

</body> 
</html> 
+0

此錯誤通常是由未完成的功能引起的。檢查一下'{'和'}'是否有不完整的''''' – ariefbayu

+1

@silent它有一個未完成的功能是因爲文件部分上傳,如我在我的問題中指定的那樣......代碼沒有任何問題。 –

+0

好吧,我想念這個問題。我雖然,通過上傳是用戶上傳文件。不是源代碼。 – ariefbayu

回答

6

如果您的服務器的Linux(或者其他Unix變體),那麼mv命令是原子,可以做這種即時更新。首先將文件複製到一個臨時名稱(如file.php.new),然後登錄到服務器並

mv file.php.new file.php 

(這個工程即使file.php存在,它將被新的所取代)。

+0

Thanks @Greg!所以如果我要更新說100個文件,在上傳之前不重命名每個文件並對每個文件運行'mv'命令,最好的方法是什麼?我想將所有文件上傳到文件夾並使用PHP來移動它們是最好的選擇嗎? –

+0

你可以寫一個腳本來做到這一點。但是,一定要*移動他們而不是*複製他們,這是關鍵。你可以使用['rename()'](http://php.net/rename)來做到這一點。 –

+0

有趣的你爲什麼說_move_而不是_copy_。這是有原因的嗎?我問的原因是我使用的FTP軟件,我可以設置爲僅上傳已更改的文件,而不是上傳每次需要幾分鐘的每個文件。如果在服務器上保留一個副本,上傳時間只有幾秒鐘,那將是非常棒的。 _copying_文件是否在某處導致問題? –

相關問題