php 使用Process facade在外部Laravel项目上运行Artisan命令会返回主项目的数据库错误

nwo49xxi  于 2023-04-04  发布在  PHP
关注(0)|答案(2)|浏览(95)

bounty将在3天后过期。回答此问题可获得+500声望奖励。ahmed希望引起更多人关注此问题。

我有两个Laravel项目,project1和project2。在project1中,我试图使用以下代码从project2运行Artisan命令:

Route::get('/', function () {
    $externalProjectPath = '/path/to/laravel/project2';
    $artisan = $externalProjectPath . '/artisan';
    $result = Process::path($externalProjectPath)->run('php ' . $artisan . ' route:list', function (string $type, string $output) {
            dump($output);
        });
});

然而,当我运行这段代码时,我遇到了以下错误:

Illuminate\Database\QueryException 

  SQLSTATE[HY000] [1049] Unknown database 'project1' (Connection: mysql, SQL: select * from `users` where `users`.`id` = 1 limit 1)

当我已经将路径更改为project2,并且Artisan命令正在project2中运行时,为什么应用程序试图连接到project1数据库?
如何在外部Laravel项目上运行Artisan命令,并使用新的Process facade获取输出而不会遇到此数据库错误?

vzgqcmou

vzgqcmou1#

我在两个文件夹中创建了两个项目,添加了您的代码,结果如预期:

然后我在.env文件中将数据库名称更改为'project 1'(我没有名称为project 1的数据库),并在代码后添加了一个新的 get 路由到'/' url:

Route::get('/', function () {
    \App\Models\User::where('users.id', 1)->withTrashed()->first();
});

我得到的错误和你的一样:

所以我的回答是在您创建了执行Process::path($externalProjectPath)->run(的路由的项目中

  • 在.env中设置了错误的数据库,或者在.env中有多个DB_DATABASE的定义,或者缓存了以前的.env配置
  • 你已经设置了一个错误的路由或重复的路由到'/' url在你的web.php或者你可能已经缓存了以前的路由定义

为了解决这个问题,我建议你进入你的Laravel项目,在那里你定义了运行Process::path($externalProjectPath)->run(的路由:

  • 检查.env中是否定义了正确的数据库名称,并且没有多个定义(您可以尝试在.env中找到 * project 1 *,或者在整个代码中找到更好的名称)
  • 检查web.php中是否只有一个路由 get('/')
  • 在任何情况下,我建议您运行php artisan route:clearphp artisan config:clear来清除路由和配置缓存
hs1ihplo

hs1ihplo2#

由于您在错误的文件夹中运行php,它可能正在使用project1.env
尝试像我们如何设置cron配置

$result = Process::path($externalProjectPath)
        ->run('cd ' . $externalProjectPath . ' && php artisan route:list', function (string $type, string $output) {
            dump($output);
        });

相关问题