更新基于PHP的站点没有错误的最佳方法

时间:2013-01-05 10:01:02

标签: php apache file-io

我有一个网站,我在本地进行编码和测试,准备好后,我将文件通过FTP上传到远程服务器,有时可能会有点慢。

如果用户尝试访问包含当前正在上传的网页的require_once的网页,则会在该特定时刻出现错误,因为该文件似乎不存在或仅部分上传。即使用户试图直接访问页面,例如example.php他们可能会遇到同样的问题。

我通过创建一个自定义包含函数来克服require_once问题,该函数检查文件的最后一行是否有标记,但这对非包含页面没有帮助,而且非常麻烦。

是否有更好的方法来更新网站,而不会误导用户有错误?

4 个答案:

答案 0 :(得分:2)

您是否研究过FTP以外的部署选项?许多部署工具(如Capistrano,通过SSH工作)将新文件复制到新文件夹中,然后在整个上载和更新过程完成时将current目录符号链接到新文件夹。这确保了原子(全部或全部)更新。

答案 1 :(得分:0)

是的,在您应该首先上传的主索引文件中输入如下内容:

<h1>Page under update</h1>
<h2>Please revisit after 10 minuts</h2>
<?php die();?>
// ... Your code is belowe

现在您可以更新其他文件,当它从主index.php

删除上面的行时

答案 2 :(得分:0)

1。 您始终可以通过以下方式关闭所有错误报告:

error_reporting(0);

(嗯,说实话 - 糟糕的解决方案)。

2。 但是,这可能不是你想要的。 让错误沉默的另一种方法是在行之前添加@。所以你可以写下来解决它:

@require_once(FILE)

(再次 - 糟糕的解决方案。你不想让错误沉默)。

3。 您可能希望使用include_once而不是require_once,这样即使文件不存在,也可以继续加载页面。

(可能会做得更好,不是吗?)

4。 最值得推荐的是先检查file_exists,然后再做你想做的事情。如果其余代码需要该页面,您可能需要输入自己的自定义错误消息并停止加载页面。

try {
    if (!file_exists('page.php')) {
        throw new Exception('Page has not been found, please try again later.');
    }
    if (!@include_once('page.php'))
    {
        throw new Exception('Page under construction, please try again later.');
    }
}
catch(Exception $e) {    
  echo $e->getMessage();
}

(我认为这是真的)。​​

答案 3 :(得分:0)

使用符号链接指向您的Web应用程序目录,并在您的Web服务器配置中引用该符号链接。将所有内容上传到实时Web应用程序的不同目录;然后只需在一切就绪后更改符号链接。

编辑

或者....如果您使用APC进行操作码缓存,请上传所有内容,并且原始内容仍应位于操作码缓存中(您应该在生产服务器中禁用apc stat test);然后在上传所有内容后刷新操作码缓存。