您如何通过 FTP 上传核心 PHP 文件而不会中断您网站的访问者

Posted

技术标签:

【中文标题】您如何通过 FTP 上传核心 PHP 文件而不会中断您网站的访问者【英文标题】:How do you upload a core PHP file via FTP without interrupting a visitor to your site 【发布时间】:2015-08-16 12:23:40 【问题描述】:

每当我管理的基于 php 的活动站点需要紧急更改代码时,我都会离线更改代码,在本地服务器上对其进行测试,然后在满意时通过 FTP 将更新后的文件上传到生产服务器。

这显然有效,但我发现当我在繁忙的网站上执行此操作时,如果有人在我上传的同时访问浏览器中的文件,他们将收到 PHP 解析错误。我认为这是因为通过 FTP 的上传在他们尝试访问时尚未完成。

由于网站 24/7 都很忙,我不能等到一段安静的时间再上传我的新文件,那么我该如何避免这种情况呢?某些 FTP 服务器是否比其他服务器更好地处理此问题,还是我打算以错误的方式部署到生产服务器?

CENTOS 6.6、Apache、ProFTPd/PureFTPd、PHP 5.3

【问题讨论】:

那么不要上传到生产目录。上传其他地方,然后在上传完成后将文件移动到位。本地移动将比 ftp-into-place 快得多。 @MarcB:是的。此外,如果初始上传是在同一个文件系统上,则移动操作是原子的,几乎是瞬时的,因为它只需要更新 inode。 我和@MarcB 在一起,我就是这样做的。我将我的提交推送到 github。当我在我的网站上进行更改时,通过 ssh 将我的数据复制到本地。 【参考方案1】:

您可以创建应用程序的两个后端(副本,例如 nginx 上游)并单独更新它(禁用当前更新的后端)。

【讨论】:

【参考方案2】:

您可以通过将所有应用程序上传到另一个目录来实现。您的公共目录可以链接到您的应用程序当前版本的目录。当您上传所有应用程序文件时,您只需切换symlink。

例如,您在

处配置了一些 apache/nginx 主机

/var/awesome-app/public_html

将您的应用程序存储在其他地方,例如你的家庭目录。将您的应用程序上传到单独的 release 目录,如下所示:

~/awesome-app/releases/1
~/awesome-app/releases/2
~/awesome-app/releases/3
...
~/awesome-app/releases/<RELEASE_NUMBER>

创建一个从您的应用程序到主机指向的路径的符号链接。这个命令应该被调用一次 - 当你设置你的环境时:

ln -s ~/awesome-app/current /var/awesome-app/public_html

上传您的应用程序后,创建(替换)符号链接到当前版本。每次发布都应调用此命令。

ln -sf ~/awesome-app/releases/4 ~/awesome-app/current

您可能还想查看Software deployment。

【讨论】:

以上是关于您如何通过 FTP 上传核心 PHP 文件而不会中断您网站的访问者的主要内容,如果未能解决你的问题,请参考以下文章

用php如何把一些文件和图片上传到另一指定的服务器

如何通过ajax上传文件而不会超时?

如何检测文件正在通过 FTP 上传

怎么通过PHP来支持FTP和HTTP上传

在 PHP 中创建文件并将其上传到 FTP 服务器而不在本地保存

通过 FTP 将文件上传到 Sharepoint 文档库