Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么Laravel总是用每个Artisan命令调用schedule()?_Php_Laravel_Laravel 5_Cron - Fatal编程技术网

Php 为什么Laravel总是用每个Artisan命令调用schedule()?

Php 为什么Laravel总是用每个Artisan命令调用schedule()?,php,laravel,laravel-5,cron,Php,Laravel,Laravel 5,Cron,我有一个名为dc\u user\u meta的表,我创建了一个artisan命令,并将其安排在kernel.php中。在克隆存储库之后,当我尝试运行PHP-artisan-migrate时,我遇到了这个错误 [Illuminate\Database\QueryException]

我有一个名为
dc\u user\u meta
的表,我创建了一个artisan命令,并将其安排在
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
,而且我根本无法运行任何artisan命令!我不知道为什么每次我尝试执行artisan命令时,PHP总是调用
schedule
方法

在这种情况下,我能做的就是在
schedule
方法中覆盖我的逻辑,就像这样

if(Schema::hasTable('dc_user_meta')){
    // Code here
}
if(Schema::hasTable('dc_user_meta')){
    // Command Logic
}
但我认为从长远来看这并不好。解决这个错误的正确方法是什么?


更新: 我只是试着像这样在
kernel.php
中覆盖对命令的调用,但仍然没有成功

if(Schema::hasTable('dc_user_meta')){
    $schedule->command('usage:update')->daily();
}
更新: 我找到了解决办法。但我认为这不是问题的答案。它解决了我的问题,但我不认为这是标准的解决方案。我只是被命令登录覆盖了,就像这样

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

关于为什么Laravel使用每个
artisan
命令调用schedule(),以及如果发生类似情况,如何以标准方式解决错误,有没有具体的答案

您的错误在于table
dc\u user\u meta
而您的逻辑是table
user\u meta
您需要执行
Schema::hasTable('dc\u user\u meta')
我确信数据库中不存在表dc\u user\u meta。

据我所知,您有表“user\u meta”而不是“dc\u user\u meta”但是您已经编写了使用表“dc\U user\U meta”的代码,因此出现了一个错误,表示“dc\U user\U meta”表未找到。

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

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

让我们看看在哪个场景中执行了什么($schedule->call()可以替换为$schedule->command()或$schedule->exec()):

但是,为什么每个命令都要执行schedule命令呢? 显然,php artisan schedule:run本身就是一个控制台命令。因此,它肯定需要有关预定命令的信息

另外,其他命令可能需要有关计划命令的信息。。。例如,如果要编写artisan命令列表:scheduledTasks。此命令要求已将所有计划的命令添加到控制台计划列表中

可能还有其他几个(内部)参数说明为什么每次都必须运行schedule函数。(我没有深入挖掘源代码…

然而关于调度命令的信息对于各种用例都很有用。

如果还有人关心这个问题


我无法复制它(L5.4)。我发出了一个命令,调用一个不存在的表,但在调用它时只得到一个错误。@cbaconier在数据库中创建表,然后尝试运行“php artisan migrate:refresh”,您使用的是哪个版本的Laravel?我使用的是laravel5.4,如果您的代码没有任何错误,它应该可以工作。代码中的某个地方有一个导致迁移失败的bug。Do:
php-artisan-migrate-vvv
查看完整堆栈和post。会让你知道发生了什么!它是
dc\u user\u meta
dc\uu
是前缀。为了显示表的名称,我编写了
user\u meta
。实际的表名是
dc\u user\u meta
,我为
dc\u user\u meta
编写了代码。那么,编写与数据库一起工作的命令逻辑以及运行
php artisan migrate
php artisan migrate:refresh
的最佳方法是什么呢?我将最后一个示例与when()方法结合使用。因此,仅当满足要求(在您的情况下,存在特定的表)时,才会执行该命令。php artisan migrate和php artisan migrate:refresh完全不受影响,如果您将代码封装在$schedule->command()或$schedule->call()中,那么这是消除此错误的标准方法。在执行确切的命令逻辑之前检查表是否存在。是吗?这是避免错误的唯一可能的方法。。。。但是如果不使用示例中的when()函数。然后,该命令根本不会被调度(因此没有其他命令或进程包含有关调度命令的信息)。如果你根本不需要的话,你的例子会有用的。那就酷吧!这就是我想知道的!