Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel会随机尝试访问一个不存在的符号链接_Php_Linux_Laravel_Nginx_Continuous Integration - Fatal编程技术网

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
  • 进入timestamp目录并运行一些Composer和Laravel命令
  • 将时间戳符号链接到名为current的目录,Nginx将访问该目录
  • 设置正确的所有权和权限
  • 重新启动PHP-FPM和Supervisor
  • 删除旧版本
  • 偶尔我会遇到这样的错误:

    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感谢您的评论。这很可能是原因。我将实施你的建议。