0

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

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

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

有没有更好的方法来更新网站而不会因错误而激怒用户?

4

4 回答 4

2

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

于 2013-01-05T10:13:22.500 回答
0

是的,在您的主 idex 文件中,您应该先上传如下内容:

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

现在您可以更新其他文件,并在结束时从主 index.php 中删除上述行

于 2013-01-05T10:07:27.677 回答
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();
}

(我认为这是真的)。

于 2013-01-05T10:12:03.103 回答
0

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

编辑

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

于 2013-01-05T10:13:27.283 回答