为什么Laravel会与每个Artisan Command一起调用schedule()?

时间:2017-07-03 03:57:39

标签: php laravel laravel-5 cron

我有一个名为dc_user_meta的表,我创建了一个工匠命令并在kernel.php中安排了它。在克隆存储库之后,当我尝试运行PHP artisan migrate时,我收到此错误。

  [Illuminate\Database\QueryException]                                                                                                              
  SQLSTATE[42S02]: Base table or view not found: 1146 Table 'database.dc_user_meta' doesn't exist (SQL: select * from `dc_user_met  
  a` where `meta_key` = usage_in_days)

不仅php artisan migrate而且我根本无法执行任何工匠命令!我不知道为什么PHP每次尝试执行任何artisan命令时都会调用schedule方法。

在这种情况下,我可以做的就是解决这个错误,就像这样在schedule方法中覆盖我的逻辑。

if(Schema::hasTable('dc_user_meta')){
    // Code here
}

但我不认为它在长期运行中表现良好。什么是解决此错误的正确方法?


更新: 我只是尝试在kernel.php覆盖调用命令,但仍然没有成功!

if(Schema::hasTable('dc_user_meta')){
    $schedule->command('usage:update')->daily();
}

更新 我得到了解决方案。但我不认为这是问题的答案。它解决了我的问题,但我不认为这是标准的解决方案。我只是被Command登录所覆盖。

if(Schema::hasTable('dc_user_meta')){
    // Command Logic
}

Laravel为每个artisan命令调用 schedule()的原因的任何具体答案,以及如果发生这样的事情,如何以标准方式解决错误!

5 个答案:

答案 0 :(得分:5)

从技术上讲,调度方法是通过 Illuminate \ Foundation \ Console \ Kernel 的构造函数调用的(这是app \ Console \ Kernel.php的父类)

因此,每次实例化控制台内核时,都会执行schedule()方法。

让我们看看在哪种情况下执行了什么($ schedule-> call()可以用$ schedule-> command()或$ schedule-> exec()代替:

protected function schedule(Schedule $schedule)
{
    // everything that is inside the schedule function is executed everytime the console kernel is booted.

    // gets exectuted every time
    \App\User::where('foo', 1)->get();


    $schedule->call(function() {
        // gets executed for every call to php artisan schedule:run
        \App\User::where('foo', 1)->get();
    });

    $schedule->call(function() {
        // gets executed for every call to php artisan schedule:run
        // IF the closure in the when() function is true;

        \App\User::where('foo', 1)->get();
    })->when(function() {
         // if true is returned the scheduled command or closure is executed otherwise it is skipped
         \Schema::hasColumn('user', 'foo');
    });

}

但是为什么要使用每个命令来执行schedule命令?

嗯,显然 php工匠日程表:运行本身就是一个控制台命令。所以它肯定需要有关预定命令的信息。

其他命令也可能需要有关已调度命令的信息...例如,如果您要编写工匠命令 list:scheduledTasks 。此命令将要求已将所有已调度的命令添加到控制台计划列表中。

可能还有其他几个(内部)参数,为什么每次都要运行调度函数。 (我没有深入挖掘源代码......)
然而......有关预定命令的信息可能对各种用例有用。

答案 1 :(得分:1)

您的错误是表$ pcregrep -M "^.*$\n\d+" text.txt Checking log log0.txt 12 Checking log log2.txt 34 56 78 Checking log log5.txt 90 ,而您的逻辑是dc_user_meta user_meta Schema::hasTable('dc_user_meta')

答案 2 :(得分:0)

我确信数据库中不存在表dc_user_meta。

答案 3 :(得分:0)

据我所知,你有桌子" user_meta"不是" dc_user_meta"但是你已经编写了代码来使用表" dc_user_meta"因此有一个错误说" dc_user_meta"找不到桌子。

答案 4 :(得分:-1)

如果有人仍然在乎这个...

<?php
# This is your app/Console/Kernel.php
use ...;

class Kernel extends ConsoleKernel {

    # Other stuff...

    protected function schedule(Schedule $schedule) {
        if( in_array('schedule:run', $_SERVER['argv']) ){
            # Your scheduler commands here...
        }
    }

}