【问题标题】:Laravel Scheduling call controllerLaravel 调度调用控制器
【发布时间】:2016-07-02 11:37:17
【问题描述】:

我使用 Laravel 任务调度,但是当我从控制器调用某些方法时出现问题。

protected function schedule(Schedule $schedule)
{
    $schedule->call('UserController@deleteInactiveUsers')->everyMinute();
    //$schedule->call('App\Http\Controllers\UserController@deleteInactiveUsers')->everyMinute();
}

当我使用未注释的行调用时,我收到此错误:

[ReflectionException]
Class RecurrenceInvoiceController does not exist

然后我插入完全限定的命名空间路径,然后我得到这个错误:

[PDOException] SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known

还有

[ErrorException] PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known 

问题出在哪里?从 Laravel 任务调度中调用 Controller 的方法,哪种方式是正确的。

【问题讨论】:

  • 你在 .env 文件中使用了什么 QUEUE_DRIVER
  • 在我的.env 文件中-> QUEUE_DRIVER=sync

标签: php laravel laravel-5 cron taskscheduler


【解决方案1】:

几个月前我偶然发现了同样的问题,直到我能解决它。 我使用 laravel 5.2,内核以这种方式调用我的驱动程序:

$schedule->call('App\Http\Controllers\MyController@MyAction')->everyMinute();

我希望这对其他人有帮助;)

【讨论】:

  • 为我工作谢谢并添加了参数选项
  • @BinitGhetiya 你是如何添加参数选项的?
  • 虽然这个答案解决了 OP 问题,但我真的认为 cron 应该调用服务函数而不是控制器,我会将你在该控制器函数中的逻辑放在服务中,我会调用它来自控制器和 cron
  • 哇..这个直接命令省了这么多代码..谢谢
【解决方案2】:

直接把这个放到kernel.php文件的schedule函数中

$schedule->call('App\Http\Controllers\YourController@function')->everyMinute();

每分钟运行一次

注意:

在本地主机中,你必须手动运行它,但在服务器上,你应该在你的 cronjob 中尝试这个命令,这将在每分钟后自动调用你的控制器函数

php -d register_argc_argv=On /home/iflasity/public_html/foldername /artisan schedule:run > /dev/null 2>&1

cd /home/iflasity/public_html/foldername && php artisan schedule:run /dev/null 2>&1

【讨论】:

    【解决方案3】:

    对我来说,第一个错误看起来你需要运行composer update,然后运行composer dump-autoload

    如果有效你也会得到第二个错误,2002错误的意思是:

    无法通过套接字连接到本地 MySQL 服务器”(请参阅​​(MySQL 文档中的客户端错误代码和消息)。

    您需要在.env 文件中设置数据库配置

    【讨论】:

    • 由于控制器在调度任务中的使用方式错误,我从控制器创建了具有相同逻辑的工匠命令。但现在我没有给出任何错误消息,但不使用此功能。我还为这个控制器创建了路由来测试这个代码并且代码可以完美地工作,但是没有。
    • 我的.env 文件没问题,因为我从控制器成功地将记录插入到数据库中,但调度不起作用
    【解决方案4】:

    好的。我解决了这个问题。问题出在 Docker Cron 容器上。 Cron 容器未与 MySQL 容器链接。 感谢所有的答案。

    【讨论】:

    • 感谢您告诉我们什么有效。请通过结合这两个来清理您的其他答案。
    【解决方案5】:

    现在我也用更简单的函数来测试在数据库中插入新货币。这是代码:

    public function handle()
        {
            $currency                = new Currency();
            $currency->currency_name = 'EUR';
            $currency->save();
    
            $this->info('New currency is successfully generated!');
        }
    

    这个函数来自laravel/app/Console/Commands。我从Kernel > schedule() 打来电话。不工作。

    当我插入简单的日志写入 handle() 函数时:

    File::put(base_path() . '/storage/logs/test_logs.txt', 'Test log ' . Carbon::now()->format('Y-m-d H:i:s') . PHP_EOL);
    

    这行得通。但是当我尝试从Models 创建新对象并保存到数据库中时 -> 这不起作用。

    【讨论】:

    • 我逐行测试这段代码。我创建新 Currency 对象并添加属性 currency_name 的前 2 行是可以的。但错误出现在第 3 行,我在这里调用 save 方法。 $currency->save()
    • 这不是答案,因此,为了正确使用 stackoverflow,您应该编辑您的问题并将任何新信息放在那里,另一方面,您正在添加很多模糊的信息,您在尝试什么去做?工匠命令?调用控制器?运行任务?请!坚持一个,这样我们就可以从某事开始工作。
    猜你喜欢
    • 2018-04-19
    • 2018-01-24
    • 2012-12-24
    • 2017-02-10
    • 2017-06-06
    • 1970-01-01
    • 2014-10-07
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多