无法让Cron工作完美运行

时间:2017-01-10 12:04:33

标签: laravel laravel-queue laravel-scheduler lumen-5.3

我使用Laravel / Lumen。我已经设置了一个简单的工作来发送短信:

<?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执行此脚本,请告诉我如何。

1 个答案:

答案 0 :(得分:0)

queue:work命令旨在作为守护程序运行。在laravel cron任务中运行基本上会使它的占用空间增加一倍。

在共享主机上以守护程序模式运行它可能很棘手,并且100%取决于cPanel允许您执行的操作。如果您有权使用“ supervisord”,则可以通过关注setting it up上的Laravel文档来实现魔术。

如果您无法将其设置为共享主机上的守护程序,则可以尝试直接从控制面板的CRON运行器运行queue:work,而不是将其包装在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将其作为前台进程运行,您可以观察它是否有任何作用。

希望这里有些帮助。