2010-10-01 131 views
3

我必须在PHP中编写脚本,它将动态地替换服务器上的一些文件。容易的事情,但问题是,我想避免在替换时用户请求这个文件的情况。然后他可能会得到不完整的文件甚至错误。最好的方法来替换服务器上的文件

对我来说最好的解决方案是在更换时阻止访问我的站点。设置.htaccess将所有请求重定向到有关短暂休息信息的页面。但通常.htaccess文件已经存在,所以当服务器获得uncomplited .htaccess文件时可能会出现这种情况。

有什么方法可以解决它吗?

编辑:非常感谢所有的答案,伙计们。你很聪明。

@ircmaxell你的想法对我来说听起来很棒。我读了PHP.net写的东西,我不知道我是否理解正确。

所以,告诉我:如果我按照你写的所有步骤添加了apc.file_update_protection到我的php.ini文件,那么在任何时候都没有办法让用户得到未完成的文件?总会有一个正确的文件?你确定100%吗?

这对我来说非常重要,因为这些替换非常经常,并且在重命名时很有可能请求文件。

回答

0

也许做尝试这样的:

  1. 删除文件并保存它的路径
  2. LN -nfs movedfilepath pathtosorrypage.html
  3. 上传文件到一些临时文件夹在服务器上
  4. 删除符号链接
  5. MV的newfile movedfilepath
1

待办事项这项工作已经完成了吗?我从来没有为此专门进行过测试,但我已经完成了你正在做的事情,而且这个问题从未出现过。 好像到

一件容易的事情对于操作系统
  1. 上传/写入到一个临时文件
  2. 当书写时,阻止访问原始文件(对文件中等待请求)
  3. 删除文件,重命名临时文件,并删除任何锁

我很确定这是操作系统应该为复制做什么。如果您使用PHP自己编写文件内容,那么您只需自己完成此操作即可。

1

尝试无轨Capistrano或方法,他们使用:

在目录

你有两件事情:

  1. 文件夹containering文件夹,每个子文件夹释放
  2. 的软链接到当前发布文件夹

当您上传新文件时,请上传新版本文件夹。检查看有没有人当前正在运行的当前版本(这可能是一个有点棘手,假设你没有,你也许可以用分贝条目做用户的一个疯狂的数字),然后重写软链接指向最新版本。

5

这里的东西,很容易,而且可以在任何本地文件系统工作在Linux上:文件

  1. 上传(或写)到一个临时文件名
  2. 移动文件(使用mv(移动)命令,无论是在FTP或命令行等,或PHP中的rename命令)来覆盖现有的。

当您执行mv命令时,它基本上删除旧的文件指针,并写入新的文件指针。由于它是在文件系统级完成的,所以它是一个原子操作。因此,客户端不能得到一个旧文件...

APC建议doing this,以防止这些问题很从此起彼伏......

还要注意的是,你可以使用rsync做得一样好(因为它基本上做到这一点的场景)的背后...

0

选项1:如果你有很多用户,这种替代是做不那么频繁了,你可以设置在网站上(块访问的维护),没有一个在一段时间后登录,最后切断所有登录的用户,以便进行更换。

选项2:如果文件被更换频繁地做(在这种情况下,你不应该做的保养,每天),它已经通过代码实现。有两个相同的文件(如果你想要同一个文件夹)。然后,通过代码,当您要替换文件时,只需要提供副本,而替换所需的文件。你可以用简单的IF来做。

伪代码:

if (replaceTime - 15 seconds <= currentTime <= replaceTime + 15 seconds){ 
    // allows 30 seconds for another script to bring in the new image into 'myImage.jpg' 
    <img src="/myFiles/myOldImage.jpg" /> 
} else { 
    <img src="/myFiles/myImage.jpg" /> 
} 

不需要更新任何数据库或手动移动/复制/重命名文件。

replaceTime + 15后已经过去了:

copyFileTo("myImage.jpg","myOldImage.jpg"); 
// Now you have the copy ready for the next time to replace 
相关问题