Проблемы с получением работы Cron для идеального запуска

Я использую Laravel/Lumen. Я настроил простую работу для отправки SMS:

<?php

namespace App\Jobs;

class SendDepositSMSAlertJob extends Job
{
    private $numbers;
    private $account;
    private $type;
    private $amount;
    private $date;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($account, $type, $amount, $date, $numbers)
    {
        $this->numbers = $numbers;
        $this->account = $account;
        $this->type = $type;
        $this->amount = $amount;
        $this->date = $date;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        foreach ($this->numbers as $number) {
            // Settings
            $url = "https://api.xxxxx.com/v3/messages/send";
            $from = "XX";
            $message = urlencode($this->account." has been credited with a " . $this->type . " deposit of GHs " . $this->amount . " on " . $this->date);

            $client_id = "xxxxxx";
            $client_secret = "xxxxxxx";
            $query_string = "?From=".$from."&To=".$number."&Content=".$message."&ClientId=".$client_id."&ClientSecret=".$client_secret."&RegisteredDelivery=true";

            $response = @file_get_contents($url.$query_string);
        }
    }
}

Теперь, когда запись сохраняется в моем контроллере, я отправляю задание:

$this->dispatch(new SendDepositSMSAlertJob($bank . ' - ' . $acNumber, $depositType, $depositAmount, $reportDate, $telNumbers));

Теперь у меня есть следующие настройки в моем kernel.php:

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        \JK\Dingo\Api\Console\Commands\RouteListCommand::class
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // Run once a minute
        $schedule->command('queue:work')->everyMinute()->withoutOverlapping();
    }
}

И в моей cPanel у меня настроена следующая работа cron:

php -d register_argc_argv=On /home/xxxxxx/xxxxxx/artisan schedule:run

Приведенная выше команда настроена на выполнение каждую минуту.

Проблема Эта настройка просто не работает для меня. На моем Bluehost VPS мой сервер многократно падал, заставляя меня перезагружаться. Очевидно, это поглощало столько памяти, и я не понимаю, почему, и поддержка не смогла мне помочь. Позвольте мне уточнить, это работало, но вызывало сбой моего сервера по крайней мере два раза в день.

Поэтому, думая, что это как-то связано с моим хостингом, я купил другой хостинг где-то еще (SiteGround). Теперь я не могу даже заставить cron работать. Каждый раз, когда cron выполняет это, отправляется на мою почту:

Fatal error: Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Resource temporarily unavailable' in /home/xxxxx/xxxxx/vendor/symfony/console/Application.php:941
Stack trace:
#0 [internal function]: Laravel\Lumen\Application->Laravel\Lumen\Concerns\{closure}(2, 'proc_open(): fo...', '/home/abc17060/...', 941, Array)
#1 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(941): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(729): Symfony\Component\Console\Application->getSttyColumns()
#3 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(690): Symfony\Component\Console\Application->getTerminalDimensions()
#4 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(623): Symfony\Component\Console\Application->getTerminalWidth()
#5 /home/xxxxx/xxxxx/vendor/laravel/lumen-framework/src/Exceptions/Handler.php(147): Symfony\Component\Console\Application->renderException(Object(ErrorException),  in /home/xxxxx/xxxxx/vendor/symfony/console/Application.php on line 941


Fatal error: Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Resource temporarily unavailable' in /home/xxxxx/xxxxx/vendor/symfony/console/Application.php:941
Stack trace:
#0 [internal function]: Laravel\Lumen\Application->Laravel\Lumen\Concerns\{closure}(2, 'proc_open(): fo...', '/home/abc17060/...', 941, Array)
#1 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(941): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(729): Symfony\Component\Console\Application->getSttyColumns()
#3 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(690): Symfony\Component\Console\Application->getTerminalDimensions()
#4 /home/xxxxx/xxxxx/vendor/symfony/console/Application.php(623): Symfony\Component\Console\Application->getTerminalWidth()
#5 /home/xxxxx/xxxxx/vendor/laravel/lumen-framework/src/Exceptions/Handler.php(147): Symfony\Component\Console\Application->renderException(Object(Symfony\Component in /home/xxxxx/xxxxx/vendor/symfony/console/Application.php on line 941

Теперь я понятия не имею, что вызывает это или как это исправить. Я считаю, что выполнил все инструкции в документации и не могу сказать, что я делаю здесь неправильно. Я провел исследование и обратился в службу поддержки обеих хостинговых компаний, но все же...

Это было последнее сообщение от службы поддержки:

Я попытался запустить cron несколько раз, но у него нет запланированных команд:

xxxxxx@c27664 [~/xxxxx]# php -d register_argc_argv=On /home/xxxxxx/xxxxxx/artisan schedule:run
No scheduled commands are ready to run.

Кроме того, я увеличил лимиты еще раз. Я установил 300 секунд для выполнения скрипта и 2048MB memory_limit.

Пожалуйста, попробуйте еще раз, и если вам нужна помощь, не стесняйтесь обновить билет.

Что-то не так с Люменом и работой? Я успешно запускаю команду в Laravel 5.1, что здесь происходит.

В качестве альтернативы, если есть гораздо более простой или эффективный способ выполнения этого скрипта с использованием обычного PHP через cron, пожалуйста, покажите мне, как это сделать.

0 ответов

В queue:workКоманда предназначена для запуска в качестве демона. Запуск внутри задачи laravel cron в основном удваивает ее объем.

Запуск его в режиме демона может быть сложной задачей на виртуальном хостинге, и это на 100% зависит от того, что позволяет вам cPanel. Если у вас есть доступ к "супервизору", то волшебство может произойти, если следовать документации Laravel по его настройке.

Если вы не можете настроить его как демон на общем хостинге, вы можете попробовать запустить queue:work непосредственно из бегуна CRON панели управления вместо того, чтобы оборачивать его внутри Laravel CRON.

php -d register_argc_argv=On /home/xxxxxx/xxxxxx/artisan queue:work --once

Это запустит его, обработает один элемент в очереди и выйдет. Это будет не так быстро, как демонизированный процессор, но он должен работать.

Вы всегда можете просто запустить очередь из командной строки (к которой у вас есть доступ) и посмотреть ее, чтобы убедиться, что она вообще работает.

php -d register_argc_argv=On /home/xxxxxx/xxxxxx/artisan queue:work запустит его как процесс переднего плана, и вы можете посмотреть, делает ли он что-нибудь.

Надеюсь, что-то здесь может помочь.

Другие вопросы по тегам