从主Laravel应用以子进程运行另一个Laravel的Artisan迁移问题
解决Laravel主应用执行子项目Artisan迁移指向主数据库的问题
核心原因
通过主Laravel应用的Process组件执行子项目Artisan命令时,子进程会继承主应用的环境变量(包括DB_*系列数据库配置变量),导致Artisan优先使用主应用的数据库配置,而非子项目目录下的.env文件。
解决方案
1. 显式指定子项目的数据库环境变量
直接在命令中注入子项目的数据库名称,强制子进程使用目标数据库:
$targetDbName = '你的子项目数据库名称'; Process::path($deploymentPath)->run("DB_DATABASE={$targetDbName} php artisan migrate --force");
2. 清空继承的数据库环境变量
使用Process的env()方法清除主应用传递的数据库相关变量,让Artisan自动读取子项目目录下的.env:
Process::path($deploymentPath) ->env([ 'DB_CONNECTION' => null, 'DB_HOST' => null, 'DB_PORT' => null, 'DB_DATABASE' => null, 'DB_USERNAME' => null, 'DB_PASSWORD' => null, ]) ->run("php artisan migrate --force");
3. 完整上下文的命令写法
使用绝对路径的PHP和Artisan文件,同时指定工作目录并覆盖环境变量,确保执行上下文完全属于子项目:
$phpAbsolutePath = '/usr/bin/php'; // 替换为你的PHP绝对路径 $artisanAbsolutePath = $deploymentPath . '/artisan'; $targetDbName = '你的子项目数据库名称'; Process::run( "{$phpAbsolutePath} {$artisanAbsolutePath} migrate --force", ['DB_DATABASE' => $targetDbName], ['cwd' => $deploymentPath] );
问题验证方法
先执行以下命令查看子进程的环境变量,确认是否继承了主应用的数据库配置:
$process = Process::path($deploymentPath)->run("env | grep DB_"); echo $process->output();
如果输出主应用的DB_*变量,说明环境变量继承是问题根源,使用上述方案即可解决。
内容的提问来源于stack exchange,提问作者GunJack
相关产品推荐
相关产品推荐

