上传文件过程中不会造成服务器端错误 [英] Uploading files without causing server side errors during the process
问题描述
我不断地调整我的软件并将其上传到服务器.由于我有客户一直在使用我的在线软件,如果客户单击链接(例如在 1 秒标记处)时部分上传了 PHP 文件(假设上传需要 3 秒),他们会收到错误,因为文件还在上传中...
I continually make tweaks to my software and upload it to the server. As I have customers using my online software all the time, if a PHP file is partially uploaded (let's say it takes 3 seconds to upload) when a customer clicks a link (say at the 1 second mark) they get an error because the file is still uploading...
Parse error: syntax error, unexpected $end in /inc/functions.php on line 475
因为我在澳大利亚,所以我们的互联网......好吧......不是很快"是一个很好的表达方式.
As I'm in Australia, our internet... well... "isn't very fast" is a nice way of putting it.
上传文件时是否使用了任何技术,以免给使用该软件的客户造成错误?
Are there any techniques used when uploading files so it does not cause errors for customers using the software?
我唯一能做的就是上传文件到另一个目录,然后运行一个 PHP 脚本,以超快的速度复制文件......但是有更好的解决方案吗?
Only thing I can thing of is uploading files to say another directory then running a PHP script that copies the files across super fast... But is there better solutions?
最终代码
感谢下面的 Greg,我找到了做事的最佳方式.以为我会分享我的最终代码.这有点粗糙但确实有效...希望它可以帮助某人
Thanks to Greg below I was able to figure out the best way to do things. Thought I'd share my final code. It's a bit rough but does the trick... Hopefully it helps someone
<?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
命令是 atomic 和可以做这种即时更新.先将文件复制到一个临时名称(如file.php.new
),然后登录服务器并
If your server is Linux (or other Unix variant), then the mv
command is atomic and can do this sort of instantaneous update. First copy the file to a temporary name (like file.php.new
), and then log in to the server and
mv file.php.new file.php
(即使 file.php
存在,它也会被新的替换).
(this works even if file.php
exists, it will be replaced by the new one).
这篇关于上传文件过程中不会造成服务器端错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!