Загрузка файлов без возникновения ошибок на стороне сервера во время процесса

Я постоянно совершенствую свое программное обеспечение и загружаю его на сервер. Поскольку у меня есть клиенты, использующие мое онлайн-программное обеспечение все время, если файл PHP частично загружен (скажем, занимает 3 секунды для загрузки), когда клиент нажимает на ссылку (скажем, на отметке 1 секунду), они получают ошибку, потому что файл по-прежнему загружается …

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> 

Если ваш сервер Linux (или другой вариант Unix), то команда mv является атомарной и может выполнять такое мгновенное обновление. Сначала скопируйте файл во временное имя (например, file.php.new ), а затем войдите на сервер и

 mv file.php.new file.php 

(это работает, даже если file.php существует, он будет заменен новым).