如何访问符号链接更新之前的原始文件,这些文件后来被移动到另一个目录

如何访问符号链接更新之前的原始文件,这些文件后来被移动到另一个目录

我们有一个网站,我们的部署过程大致如下(排除了许多不相关的步骤)

echo "Remove previous, if it exists, we don't need that anymore"
rm -rf /home/[XXX]/php_code/previous

echo "Create the current dir if it doesn't exist (just in case this is the first deploy to this server)"
mkdir -p /home/[XXX]/php_code/current

echo "Create the var_www dir if it doesn't exist (just in case this is the first deploy to this server)"
mkdir -p /home/[XXX]/var_www

echo "Copy current to previous so we can use temporarily"
cp -R /home/[XXX]/php_code/current/* /home/[XXX]/php_code/previous/

echo "Atomically swap the symbolic link to use previous instead of current"
ln -s /home/[XXX]/php_code/previous /home/[XXX]/var_www/live_tmp && mv -Tf /home/[XXX]/var_www/live_tmp /home/[XXX]/var_www/live

# Rsync latest code into the current dir, code not shown here

echo "Atomically swap the symbolic link to use current instead of previous"
ln -s /home/[XXX]/php_code/current /home/[XXX]/var_www/live_tmp && mv -Tf /home/[XXX]/var_www/live_tmp /home/[XXX]/var_www/live

我们遇到并希望得到帮助的问题是,任何网站页面加载所做的第一件事就是找出应用程序的基本目录并将其定义为常量(我们使用 PHP)。如果在页面加载期间发生部署,系统将尝试include()使用原始完整路径访问文件并获取该文件的新版本。我们需要它从现在已移动的旧目录中获取旧版本,如下所示:

  1. 系统开始页面加载并确定SYSTEM_ROOT_PATH常量/home/[XXX]/var_www/live或通过使用 PHPrealpath()来确定/home/[XXX]/php_code/current

  2. 更新后的符号链接/home/[XXX]/var_www/live指向的位置/home/[XXX]/php_code/previous而不是/home/[XXX]/php_code/current原来的位置。

  3. 系统尝试加载/home/[XXX]/var_www/live/something.php/home/[XXX]/php_code/current/something.php获取/home/[XXX]/php_code/previous/something.php

如果解释得不够清楚,我很抱歉。如果有人能提供一些关于如何解决这个问题的建议,我将不胜感激。谢谢。

答案1

current不应该是包含文件的实际目录,而应该是一个符号链接。这是 capistrano 的做法:

  1. 创建一个以当前日期命名的目录。
  2. 将新文件部署到该目录。
  3. 更改current符号链接以指向新目录。
  4. 删除所有旧的不需要的目录。

相关内容