Php Laravel会随机尝试访问一个不存在的符号链接
首先,请允许我解释我的部署是如何工作的:Php Laravel会随机尝试访问一个不存在的符号链接,php,linux,laravel,nginx,continuous-integration,Php,Linux,Laravel,Nginx,Continuous Integration,首先,请允许我解释我的部署是如何工作的: 获取最新代码并放入临时目录 以历元格式获取当前时间戳并存储在变量中 使用时间戳的名称创建一个新目录,并将最新代码移到该目录中 创建指向供应商和存储目录的符号链接。同时为.env 进入timestamp目录并运行一些Composer和Laravel命令 将时间戳符号链接到名为current的目录,Nginx将访问该目录 设置正确的所有权和权限 重新启动PHP-FPM和Supervisor 删除旧版本 偶尔我会遇到这样的错误: The stream or f
供应商
和存储
目录的符号链接。同时为.env
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的评论。用
php artisan queue:restart
替换supervisorctl restart all
,似乎可以阻止错误的发生。既然您在部署中提到了一个主管,那么您是否在每次重新部署时都重新启动队列?因为这将使一个进程在内存中运行上一个路径。重新启动主管不会重新启动队列进程。@N69S感谢您的评论。这很可能是原因。我将实施你的建议。