【问题标题】:Running laravel queue:work on a shared hosting运行 laravel 队列:在共享主机上工作
【发布时间】:2017-09-10 14:12:36
【问题描述】:

我希望我的 laravel queue:work 继续在共享主机上运行,​​这是一个共享主机(不在 VPS 上)我无法安装任何东西,因为当我几乎所有在线资源时正在寻找这个建议安装主管。所以基本上我想我可以创建一个 cron 作业来检查队列是否没有运行并启动它,关于如何解决这个问题的任何帮助,因为我有点卡住了,谢谢。

附注我在 Linux 服务器和 Laravel 5.3 上

【问题讨论】:

    标签: laravel laravel-queue


    【解决方案1】:

    正如您提到的,您使用的是共享主机,请按照以下步骤操作。

    第 1 步。 您需要将队列驱动程序设置为database

    第 2 步 您需要使用以下命令设置 cron 作业 php /path/to/application/artisan queue:work --queue=high,default

    你可以试一试。我希望它会起作用。

    【讨论】:

    • 好吧,首先我使用的是 sqs,但我猜这并不重要,其次 cron 作业应该多久执行一次,因为如果它执行一次,我是否应该担心服务器可能会暂时关闭并且进程会终止了吗?
    • cron 需要每分钟触发一次,只有你才能获得作业的最大准确性
    • 下一个命令会替换上一个命令还是会出现多个命令并行执行的情况
    • 但是这种方式会消耗大量内存,如何避免呢?
    • @Ishaan 你可能需要添加一个像这样的标志 php artisan queue:work --queue=high,default --stop-when-empty
    【解决方案2】:

    这是搜索了几天后对我有用的解决方案。

    flock -n /tmp/latavel_queues.lockfile /usr/bin/php /path/to/laravel/artisan queue:listen

    https://laracasts.com/discuss/channels/servers/database-queue-on-shared-hosting

    【讨论】:

      【解决方案3】:

      在 Laravel 8 中,您可以选择 --max-timequeue:work,它允许它在一段时间后停止作业处理。

      php artisan queue:work --max-time=300
      

      您可以设置一个 cron 作业,例如,每 5 分钟运行一次作业处理,并将 --max-time 选项设置为 5 分钟(300 秒)。在这种情况下,cron 将运行作业处理,300 秒后queue:work 将退出,几秒钟后,cron 将再次运行作业处理,依此类推。

      【讨论】:

        【解决方案4】:

        最好的方法是在你的面板任务上设置followin命令(我使用的是plesk控制面板,它让我可以在那里设置任务)

        php artisan queue:work --once
        

        注意:在我的共享主机中,由于它们的服务器配置,我必须设置以下值:

        1. php: /opt/plesk/php/7.2/bin/php -q
        2. 工匠: /var/www/vhosts/t4f.ir/httpdocs/artisan
        3. 我的命令:那么我应该编写命令

        所以,结果会是这样的:

        /opt/plesk/php/7.2/bin/php -q /var/www/vhosts/t4f.ir/httpdocs/artisan queue:work --once
        

        运行时还有另一个选项,我将其设置为 Cron 类型,值为:* * * * *,这意味着每分钟都会执行此代码。当我在命令末尾使用 --once 时,一旦执行命令并且作业完成,它将被终止。 关于并发执行,我不担心,因为它是在排队系统中处理的,这是这个系统的责任。

        【讨论】:

        • -q 是为了让它安静吗?
        • @MichaelSørensen 老实说,我不知道 :) 我根据我上次的搜索使用它,但很高兴收到你的来信,如果你能找到它。我会学习的。
        【解决方案5】:

        另一种解决方案(我以这种方式解决了同样的问题)。你可以这样写脚本:

        # getting running processes with name "queue:work"
        QUEUE_STATUS=$(ps aux | grep "queue:work")
        
        # check is queue:work started, if no, start it
        if $( echo $QUEUE_STATUS | grep --quiet 'artisan queue:work')
        then
            exit;
        else
            php ~/public_html/artisan queue:work
        fi
        

        并在 CRON 中运行它。我每 10 分钟跑一次。

        【讨论】:

        • cron 检测到它有队列工作,但是当我在 shell 上检查它时,它没有任何关于队列的进程
        【解决方案6】:

        尝试添加两个 cron 作业:

        1. 清除缓存:
        /usr/local/bin/php /home/<path-to-project>/artisan cache:clear
        
        1. 运行调度程序
        /usr/local/bin/php /home/<path-to-project>/artisan schedule:run
        

        另外,请确保您的 app\Console\Kernel.php 具有类似

        protected function schedule(Schedule $schedule)
            {
                $schedule->command('queue:work --tries=3')
                    ->cron('* * * * *')
                    ->withoutOverlapping(5);
            }
        

        如果队列开始工作,则删除第一个作业(要删除缓存的作业)

        【讨论】:

        • 我已经完成了上述操作,没有任何运行
        【解决方案7】:

        我想出了一个技巧来完成这个

        在文件Illuminate\Queue\Worker.php 我当前的 laravel 版本(5.3)在 第 151 行;在runNextJob($connectionName, $queue, WorkerOptions $options)函数上添加else如下

        if ($job) {
            return $this->process(
                $connectionName, $job, $options
            );
         } else {
            $this->stop();
        }
        

        现在创建 cron 作业,使用命令 php artisan queue:work 运行您喜欢的次数,队列耗尽时,它将退出(但应该频繁,因为进程存在)

        更新: 使用带有withoutOverlapping() 的任务计划可以防止命令的进一步调用(如果它已经在运行),因此这是一个更好的选择,因为前一个是您每次都必须进行的更改@ 987654327@或composer update

        【讨论】:

          【解决方案8】:

          // 第一步:运行调度器

          /usr/local/bin/php /home/USERNAME/public_html/PROJECT_FOLDER/artisan schedule:run >> /dev/null 2>&1
          

          // kernel.php 中的第 2 步

          protected function schedule(Schedule $schedule)
              {
                  $schedule->command('queue:work', [
                  '--max-time' => 300
                  ])->withoutOverlapping();
          

          // 第三步 测试它。 ;)

          【讨论】:

            猜你喜欢
            • 2018-07-11
            • 2018-06-05
            • 1970-01-01
            • 2018-11-30
            • 2020-03-04
            • 1970-01-01
            • 2018-04-20
            • 1970-01-01
            • 2015-06-18
            相关资源
            最近更新 更多