2012-06-01 20 views
6

Ciągle wprowadzam poprawki do mojego oprogramowania i przesyłam je na serwer. Ponieważ klienci ciągle korzystają z mojego oprogramowania online, jeśli plik PHP jest częściowo przesłany (załóżmy, że trwa to 3 sekundy, aby przesłać), gdy klient kliknie łącze (powiedzmy na 1 sekundę), pojawia się błąd, ponieważ plik nadal ładuje ...Przesyłanie plików bez powodowania błędów po stronie serwera podczas procesu

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

Jak już jestem w Australii, nasz internet ... cóż ... "nie jest bardzo szybki" to dobry sposób na jego wprowadzenie.

Czy są jakieś techniki stosowane podczas przesyłania plików, aby nie powodowały błędów dla klientów korzystających z oprogramowania?

Jedyne, co mogę zrobić to ładowanie plików, aby powiedzieć inny katalog, a następnie uruchomienie skryptu PHP, który kopiuje pliki przez super szybki ... Ale czy istnieją lepsze rozwiązania?

KOD FINAL

Dzięki Greg poniżej udało mi się dowiedzieć, że najlepszym sposobem, aby robić różne rzeczy. Pomyślałem, że podzielę się moim ostatnim kodem. To trochę szorstki, ale załatwia sprawę ... Mam nadzieję, że to pomoże ktoś

<?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

ten błąd jest zwykle spowodowany przez niedokończoną funkcję. Sprawdź, czy masz niepełną parę '{' i '}' – ariefbayu

+1

@silent Powodem, dla którego ma niedokończoną funkcję, jest to, że plik jest częściowo przesłany, jak określono w moim pytaniu ... Nie ma nic złego w tym kodzie. –

+0

OK, tęsknię rozumiałem pytanie. Ja jednak, przez przesyłanie, użytkownik przesyła pliki. Nie kod źródłowy. – ariefbayu

Odpowiedz

6

Jeśli serwer jest Linux (lub inny wariant Unix), a następnie komenda mv jest atomowy i może zrobić ten rodzaj chwilowej aktualizacji . Najpierw skopiować plik do tymczasowej nazwie (jak file.php.new), a następnie zalogować się do serwera i

mv file.php.new file.php 

(działa nawet jeśli file.php istnieje, zostanie on zastąpiony przez nowy).

+0

Dzięki @Greg! Więc jeśli mam zaktualizować, powiedzmy 100 plików, jaki byłby najlepszy sposób bez zmiany nazwy każdego pliku przed przesłaniem i uruchomienia polecenia 'mv' dla każdego pliku? Czy mój pomysł przesłania wszystkich plików do folderu i użycia PHP do przeniesienia ich będzie najlepszą opcją? –

+0

Możesz napisać skrypt, aby to zrobić. Jednak pamiętaj, aby * przenieść * je zamiast * kopiować * je, to jest kluczowy punkt. Możesz użyć ['rename()'] (http://php.net/rename), aby to zrobić. –

+0

Ciekawe, dlaczego powiedziałeś _move_ zamiast _copy_. Czy jest powód ku temu? Powodem, dla którego pytam, jest oprogramowanie FTP, którego używam. Mogę ustawić tylko przesyłać pliki, które uległy zmianie, zamiast przesyłać każdy plik, który za każdym razem zajmuje kilka minut. Byłoby wspaniale zostawić duplikat na serwerze, aby czas wysyłania był tylko kilka sekund. Czy _kopiowanie_ plików powoduje gdzieś problemy? –

Powiązane problemy