Laravel 会随机尝试访问一个不存在的符号链接

Laravel would randomly try to access a non existent symlink

首先,请允许我解释一下我的部署是如何工作的:

  1. 获取最新代码并放入临时目录
  2. 获取纪元格式的当前时间戳并存储在变量中
  3. 使用时间戳名称创建一个新目录,并将最新代码移至该目录
  4. 创建指向 vendorstorage 目录的符号链接。同时为 .env
  5. 创建一个符号链接
  6. 进入时间戳目录和 运行 一些 Composer 和 Laravel 命令
  7. 将时间戳符号链接到名为 current 的目录,Nginx
  8. 将访问该目录
  9. 设置正确的所有权和权限
  10. 重启PHP-FPM和Supervisor
  11. 删除旧版本

偶尔我会得到这样的错误:

The stream or file "/usr/share/nginx/html/sample_directory/releases/1617243734/storage/logs/laravel-2021-04-07.log" could not be opened in append mode: failed to open stream: Permission denied

其中 1617243734 是不再存在的旧时间戳目录。

有人知道这个问题的原因吗?

下面是部署文件:

#!/bin/sh

########################################
# Get current timestamp in epoch format
########################################
timestamp=$(date +%s)

##############################################################################
# Create new directory based on timestamp and move code into timestamp folder
##############################################################################
mkdir /usr/share/nginx/html/sample_directory/releases/$timestamp
mv /usr/share/nginx/html/sample_directory/temp/* /usr/share/nginx/html/sample_directory/releases/$timestamp/
mv /usr/share/nginx/html/sample_directory/temp/.editorconfig /usr/share/nginx/html/sample_directory/releases/$timestamp/
mv /usr/share/nginx/html/sample_directory/temp/.git /usr/share/nginx/html/sample_directory/releases/$timestamp/
mv /usr/share/nginx/html/sample_directory/temp/.gitattributes /usr/share/nginx/html/sample_directory/releases/$timestamp/
mv /usr/share/nginx/html/sample_directory/temp/.idea /usr/share/nginx/html/sample_directory/releases/$timestamp/
mv /usr/share/nginx/html/sample_directory/temp/.styleci.yml /usr/share/nginx/html/sample_directory/releases/$timestamp/
mv /usr/share/nginx/html/sample_directory/temp/.gitignore /usr/share/nginx/html/sample_directory/releases/$timestamp/

#############################################################################
# Create symlinks to vendor & storage directories. Also symlink to .env file
#############################################################################
rm -rf /usr/share/nginx/html/sample_directory/releases/$timestamp/storage
ln -s /usr/share/nginx/html/sample_directory/shared/storage /usr/share/nginx/html/sample_directory/releases/$timestamp/ 
ln -s /usr/share/nginx/html/sample_directory/shared/vendor /usr/share/nginx/html/sample_directory/releases/$timestamp/
ln -s /usr/share/nginx/html/sample_directory/shared/.env /usr/share/nginx/html/sample_directory/releases/$timestamp/

#####################################
# Run composer install
#####################################
cd /usr/share/nginx/html/sample_directory/releases/$timestamp
composer install

##############################
# Run needed Laravel commands
##############################
php artisan migrate
php artisan config:cache
composer dump-autoload
php artisan config:cache

############################################
# Symlink current to the new release directory
############################################
rm -r /usr/share/nginx/html/sample_directory/current
ln -sv /usr/share/nginx/html/sample_directory/releases/$timestamp /usr/share/nginx/html/sample_directory/current

##################################
# Change permission and ownership
##################################
chown -R nginx:nginx /usr/share/nginx/html/sample_directory
find /usr/share/nginx/html/sample_directory -type d -exec chmod 775 {} \;
find /usr/share/nginx/html/sample_directory -type f -exec chmod 664 {} \;

##############
# Restart FPM
##############
systemctl restart php-fpm

####################
# Restart supervisor
####################
supervisorctl restart all

############################
# Keep only current release
############################
cd /usr/share/nginx/html/sample_directory/releases
ls -1t | tail -n +2 | xargs rm -rf

感谢@N69S 的评论。将 supervisorctl restart all 替换为 php artisan queue:restart 似乎可以阻止错误的发生。