【问题标题】:Laravel programatically calling artisan command from web.php in productionLaravel 在生产中以编程方式从 web.php 调用工匠命令
【发布时间】:2018-08-15 23:09:08
【问题描述】:

我有以下路线:

Route::get('/beneficiaries/seed', function () {
    echo "<p>Database seeding started...</p>";
    $exitCode = Artisan::call('db:seed');
    echo "<p>Database seeding completed.</p>";
});

在我的本地环境中,当我访问“/beneficiaries/seed”时,它会为数据库播种。但如果我在生产中做同样的事情,它不会。我刚刚复制了播种器类和路由文件。

数据库播种机:

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call(BeneficiariesTableSeeder::class);
    }
}

BeneficiariesTableSeeder:

class BeneficiariesTableSeeder extends Seeder
{
    public function run()
    {
        //seeding logic...
    }
}

为什么我的生产 Artisan 命令没有被执行? (我没有使用数据库事务。即使没有它,本地数据库也会被播种,因为没有引发错误。)

【问题讨论】:

  • production 环境中的播种是“安全的”我猜,您是否尝试过在 production 环境中通过 CLI 运行您的工匠命令?
  • 这是一种暂存环境,因此,我没有对生产服务器的 shell 访问权限。 :(
  • 您是否尝试在您的 stg 环境中检查您的日志文件?
  • 是的,里面什么都没有。

标签: php laravel laravel-artisan laravel-5.6


【解决方案1】:

当您在生产环境中运行 php artisan db:seed 时,会出现一条警告,询问您是否确定在生产环境中植入数据库。

生产中的此警告确认是 Artisan::call('db:seed') 在生产中不起作用的原因。

要绕过警告,您可以像这样使用--force 标志:php artisan db:seed --force

解决方案

要在代码中执行相同操作,请使用 Artisan::call('db:seed', ['--force' =&gt; true]);

【讨论】:

  • 很棒的技术答案,但 IMO 的真正答案可能是“啊!不要那样做!”我不希望 Google 抓取我的网站时无意中为其添加了大量数据。
  • 完全同意@ceejayoz,在生产环境中这样做通常是一种不好的做法,但在我们了解更多之前不能说太多。也许有一个中间件可以避免只有某些“管理员”角色的用户这样做。或者,这条路由被列入了 IP 白名单,供某个其他应用在“危急”情况下调用
  • 谢谢,今晚我会试试这个解决方案,然后回来。 (Y)
猜你喜欢
  • 2019-11-20
  • 2016-04-07
  • 2020-02-05
  • 2022-08-10
  • 2014-08-30
  • 1970-01-01
  • 2014-09-07
  • 2013-09-25
  • 2015-09-24
相关资源
最近更新 更多