Laravel Запланированная очередь: работа не работает автоматически, необходимо ручной триггер - PullRequest
0 голосов
/ 23 ноября 2018

У меня очень большая задача cron, которую нужно выполнить, но сервер не может ее обработать из-за утечек памяти, поэтому я следую предложению использовать laravel Queue, и потому что я не всегда могу запустить php artisan queue:work, поэтомуя написал запланированную команду очереди, которая запускается каждые 5 минут, но очередь не работает, если я не запускаю ее вручную на сервере.

Вот моя команда для очереди:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class EnsureQueueListenerIsRunning extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'queue:checkup';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Ensure that the queue listener is running.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
        $this->startQueueListener();
        if ( ! $this->isQueueListenerRunning()) {
            $this->comment('Queue listener is being started.');
            $pid = $this->startQueueListener();
            $this->saveQueueListenerPID($pid);
        }
        $this->comment('Queue listener is running.');
    }

    /**
     * Check if the queue listener is running.
     *
     * @return bool
     */
    private function isQueueListenerRunning()
    {
        if ( ! $pid = $this->getLastQueueListenerPID()) {
            return false;
        }
        $process = exec("ps -p $pid -opid=,cmd=");
        //$processIsQueueListener = str_contains($process, 'queue:listen'); // 5.1
        $processIsQueueListener = ! empty($process); // 5.6 - see comments
        return $processIsQueueListener;
    }
    /**
     * Get any existing queue listener PID.
     *
     * @return bool|string
     */
    private function getLastQueueListenerPID()
    {
        if ( ! file_exists(__DIR__ . '/queue.pid')) {
            return false;
        }
        return file_get_contents(__DIR__ . '/queue.pid');
    }
    /**
     * Save the queue listener PID to a file.
     *
     * @param $pid
     *
     * @return void
     */
    private function saveQueueListenerPID($pid)
    {
        file_put_contents(__DIR__ . '/queue.pid', $pid);
    }
    /**
     * Start the queue listener.
     *
     * @return int
     */
    private function startQueueListener()
    {
        //$command = 'php-cli ' . base_path() . '/artisan queue:listen --timeout=60 --sleep=5 --tries=3 > /dev/null & echo $!'; // 5.1
        $command = 'php artisan queue:work --timeout=60 --sleep=5 --tries=3 > /dev/null & echo $!'; // 5.6 - see comments
        $pid = exec($command);
        return $pid;
    }
}

Вотядро:

$schedule->command('queue:checkup')->everyFiveMinutes();

Что я должен сделать, чтобы это работало?

1 Ответ

0 голосов
/ 23 ноября 2018

, если вы хотите настроить автоматический запуск задания крона без запуска с помощью команды. **

перейдите на свой терминал: и выполните эту команду

crontab -e

Откроется файл crontab на сервере, вставьте этот код внутрь, сохраните его и выйдите из

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...