【发布时间】:2022-01-10 14:01:45
【问题描述】:
我有一个未经修改的新 Laravel 项目,我正在尝试启动并运行我的第一个模型。我使用./vendor/bin/sail up 以默认设置运行网络服务器和 MySQL。我可以从 DBeaver 访问数据库,迁移运行良好,我什至可以使用 tinker 从终端访问我的数据库数据:
$ php artisan tinker
Psy Shell v0.10.12 (PHP 7.4.3 — cli) by Justin Hileman
>>> use App\Models\User;
>>> User::all()
=> Illuminate\Database\Eloquent\Collection {#4290
all: [
App\Models\User {#4292
id: 1,
name: "Johannes Molenaar",
email: "gunes.dani@example.net",
email_verified_at: "2022-01-10 13:51:35",
#password: "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi",
#remember_token: "bhuBvEAZ9c",
created_at: "2022-01-10 13:51:35",
updated_at: "2022-01-10 13:51:35",
},
],
}
现在,当我尝试在我的 routes/web.php 文件(或与此相关的控制器)中执行任何此操作时,它不起作用:
Route::get('/', function() {
App\Models\User::all();
});
我得到的错误是:
照亮\数据库\查询异常
SQLSTATE[HY000] [2002] 连接被拒绝(SQL: select * from `users`)
无论我使用什么模型或 ORM 函数,它们都会给我同样的错误。我检查了我的.env 配置,但我认为该配置中的错误也意味着工匠将无法访问数据库。
.env 文件:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=tgi_laravel
DB_USERNAME=sail
DB_PASSWORD=password
config/database.php:
'connections' => [
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
// sqlite, pgsql and sqlsrv here
],
有没有人知道这里会出什么问题?如果有任何其他信息需要评估此问题,请告诉我。
编辑:
我在 web 项目中使用 php 8.1.1,但 Tinker 似乎在 7.4.3 上运行。将服务器的 php 版本更改为 7.4.27 并不能解决此问题(将 docker 映像更改为 sail-7.4/app)。
清除配置缓存不起作用 (php artisan config:clear)。
将DB_HOST 更改为localhost(而不是127.0.0.1)会将错误更改为“没有这样的文件或目录”。
【问题讨论】:
-
"我在 web 项目中使用 php 8.1.1,但 Tinker 似乎在 7.4.3 上运行" 您如何确认这一点?为什么在您的服务器上运行 2 个版本的 PHP?默认情况下,MySQL 已禁用网络,您应该通过套接字使用 localhost 而不是 127.0.0.1。您是否确认数据库正在运行,并且您是否已将 PHP 配置为使用适当的套接字文件?
-
@miken32 Tinker 在启动时提到它的版本(见我的帖子),我使用
phpversion()吐出网络服务器正在使用的版本。不同之处在于 Tinker 在我的本地 php 版本上运行,而网络服务器在 Docker 容器中运行。正如我稍后添加的那样,无论如何它似乎没有任何区别。 -
很明显,如果你的 Laravel 应用在一个 docket 容器中,你也必须从容器中运行 artisan 命令!
-
这仍然不能解决我的问题。
-
@miken32 你确实给了我一个很好的提示:从 docker 容器中运行
php artisan tinker不起作用。这让我相信 MySQL 可以从容器外部访问,但不能从容器内部访问。这让我找到了最终的解决方案,谢谢!