From 53537bb9ee4eba3e673ff714ae68ecfd996d1dfb Mon Sep 17 00:00:00 2001 From: WuYongJie <549727955@qq.com> Date: Fri, 24 Jul 2026 22:30:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=85=A8=E6=96=B0?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=88=87=E6=8D=A2=E5=85=B1=E4=BA=AB=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Utilities/SystemDatabaseConfiguration.php | 30 ++++++++++++++++++- .../SystemDatabasePersistenceTest.php | 25 ++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/app/Utilities/SystemDatabaseConfiguration.php b/app/Utilities/SystemDatabaseConfiguration.php index 867b9567..bfff5d15 100644 --- a/app/Utilities/SystemDatabaseConfiguration.php +++ b/app/Utilities/SystemDatabaseConfiguration.php @@ -384,9 +384,15 @@ class SystemDatabaseConfiguration protected function runFreshVerification(string $command): void { + // 当前网页/Artisan 进程启动时,Laravel Dotenv 已把旧数据库值放进 + // 进程环境。若直接启动子进程,Symfony Process 会继承这些旧值, + // 新进程便不会读取刚写入 .env 的共享库配置,导致全新环境必然误判 + // 为 bootstrap 并回滚。显式移除本次切换涉及的键,让子进程以磁盘 + // 上最新(或刚恢复)的 .env 为唯一事实来源。 $process = new Process( [PHP_BINARY, base_path('artisan'), $command, '--no-ansi', '--quiet'], - base_path() + base_path(), + $this->freshVerificationEnvironment() ); $process->setTimeout(60); $process->run(); @@ -396,6 +402,28 @@ class SystemDatabaseConfiguration } } + /** + * @return array + */ + protected function freshVerificationEnvironment(): array + { + return array_fill_keys([ + 'DB_CONNECTION', + 'DB_HOST', + 'DB_PORT', + 'DB_DATABASE', + 'DB_USERNAME', + 'DB_PASSWORD', + 'DB_PREFIX', + 'MYSQL_ATTR_SSL_CIPHER', + 'MYSQL_ATTR_SSL_CA', + 'MYSQL_ATTR_SSL_VERIFY_SERVER_CERT', + 'SYSTEM_DATABASE_MODE', + 'UPSTREAM_STORED_CONFIG_ENABLED', + 'UPSTREAM_LOCAL_CONFIG_ENABLED', + ], false); + } + private function quoteIdentifier(string $identifier): string { return '`' . str_replace('`', '``', $identifier) . '`'; diff --git a/tests/Unit/Utilities/SystemDatabasePersistenceTest.php b/tests/Unit/Utilities/SystemDatabasePersistenceTest.php index 9bb7277a..e188904f 100644 --- a/tests/Unit/Utilities/SystemDatabasePersistenceTest.php +++ b/tests/Unit/Utilities/SystemDatabasePersistenceTest.php @@ -87,4 +87,29 @@ class SystemDatabasePersistenceTest extends TestCase } } } + + public function test_fresh_verification_does_not_inherit_stale_database_environment(): void + { + $configuration = new class extends SystemDatabaseConfiguration { + public function verificationEnvironment(): array + { + return $this->freshVerificationEnvironment(); + } + }; + + $environment = $configuration->verificationEnvironment(); + + foreach ([ + 'DB_HOST', + 'DB_DATABASE', + 'DB_PASSWORD', + 'DB_PREFIX', + 'SYSTEM_DATABASE_MODE', + 'UPSTREAM_STORED_CONFIG_ENABLED', + 'UPSTREAM_LOCAL_CONFIG_ENABLED', + ] as $key) { + $this->assertArrayHasKey($key, $environment); + $this->assertFalse($environment[$key]); + } + } }