Laravel 和 MySQL 8:修复 MySQL Server Has Gone Away 错误

发布时间 作者

Laravel and MySQL 8: Fixing MySQL Server Has Gone Away Error image

更新时间 2019 年 12 月 6 日:Ayesh Karunaratne 分享了 他的文章,关于如何解决这个问题,并澄清了 PHP 7.4 确实支持新的默认 MySQL 密码插件。本文已更新,纠正了原始文章中的一些不准确信息。

如果您尝试将 Laravel 应用程序升级到使用 MySQL 8,您可能会遇到以下错误,让您摸不着头脑

SQLSTATE[HY000] [2006] MySQL server has gone away

php.net 手册 中有一个解释

在运行 7.1.16 之前的 PHP 版本或 7.2.4 之前的 PHP 7.2 时,将 MySQL 8 服务器的默认密码插件设置为 mysql_native_password,否则您会看到类似于 The server requested authentication method unknown to the client [caching_sha2_password] 的错误,即使 caching_sha2_password 没有使用。

这是因为 MySQL 8 默认使用 caching_sha2_password,这是一个旧版 PHP (mysqlnd) 版本无法识别的插件。相反,通过在 my.cnf 中设置 default_authentication_plugin=mysql_native_password 来更改它。caching_sha2_password 插件将在未来的 PHP 版本中得到支持。在此之前,mysql_xdevapi 扩展支持它。

PHP 7.4 现在支持 caching_sha2_password 身份验证,但如果您数据库用户没有使用新的默认插件,您仍然可能会遇到上述错误。Ayesh Karunaratne 发布了一个 深入文章,介绍如何解决这个问题,您应该查看它以了解真正的解决方案!

但是,如果您使用的是旧版本的 PHP,请按照以下步骤操作,以便 MySQL 8 与 PDO 一起使用

首先,我们需要找到 MySQL 将查找配置文件的路径。我们可以通过运行 mysql --help 来找到它。该命令打印出大量信息,但您正在寻找类似于以下内容的东西

mysql --help
...
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf

从您的命令输出中获取路径,并使用从 mysql --help 获取的路径调整以下内容

ls -la \
/etc/my.cnf \
/etc/mysql/my.cnf \
/usr/local/etc/my.cnf \
~/.my.cnf
 
ls: /etc/my.cnf: No such file or directory
ls: /etc/mysql/my.cnf: No such file or directory
-rw-r--r-- 1 paul staff 61 Dec 5 19:40 /Users/paul/.my.cnf
-rw-r--r-- 1 paul admin 113 Oct 28 2017 /usr/local/etc/my.cnf

我喜欢从 ~/.my.cnf 管理文件,但是除非您之前做过,否则您可能需要创建该文件,如果您想从该路径管理配置。

我建议您使用 ~/.my.cnf 路径,但是无论您确定使用哪个路径,您都需要添加以下内容

[mysqld]
default_authentication_plugin=mysql_native_password

如果您使用的是 Homebrew 并想更新 /usr/local/etc/my.cnf 文件,请在 [mysqld] 下的文件末尾添加以下内容

# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
default_authentication_plugin=mysql_native_password

最后,您需要使用适合您系统的任何方法重新启动 MySQL。如果您在 Mac 上使用 Homebrew,您可以运行 brew services

brew services restart mysql

如果您使用的是 Docker,以下是一个 Docker Compose 配置示例,用于使 MySQL 8 与 Laravel 和其他 PHP 项目一起使用

services:
# ...
mysql:
image: mysql:8.0
# PDO Doesn't support MySQL 8 caching_sha2_password Authentication
# @see https://dev.mysqlserver.cn/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password
command: --default-authentication-plugin=mysql_native_password
ports:
- 13306:3306
volumes:
- mysql:/var/lib/mysql
environment:
MYSQL_DATABASE: my_database
MYSQL_ROOT_PASSWORD: root
volumes:
mysql:
driver: "local"

在进行了更改之后,您应该能够从 PHP 应用程序连接到 MySQL 8!

Paul Redmond photo

Laravel News 的编外作者。全栈 Web 开发人员和作家。

归档于
Cube

Laravel 新闻通讯

加入 40,000 多名其他开发者,绝不错过新的技巧、教程等等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成和对本地和生产环境的即时反馈进行尝试。

Tinkerwell
No Compromises logo

无妥协

Joel 和 Aaron,来自无妥协播客的两位经验丰富的开发者,现在可以为您雇用 Laravel 项目。 ⬧ 固定价格为每月 7500 美元。 ⬧ 无需冗长的销售流程。 ⬧ 无需签订合同。 ⬧ 100% 返款保证。

无妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,以确保您的 Web 应用程序成功。

Kirschbaum
Shift logo

Shift

正在运行旧版本的 Laravel 吗?即时自动 Laravel 升级和代码现代化,让您的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

只需每月 2500 美元,即可为您的项目配备经验丰富的 Laravel 开发人员,拥有 4-6 年的经验。获得 160 小时的专用专业知识和无风险的 15 天试用。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

现在就获得好运 - Laravel 开发的理想选择,拥有超过十年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar:Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的强大功能带入 Laravel。

Lunar:Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 工作板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动套件

SaaSykit 是一个 Laravel SaaS 启动套件,它包含运行现代 SaaS 所需的所有功能。付款、精美结账、管理面板、用户仪表板、身份验证、现成组件、统计数据、博客、文档等等。

SaaSykit:Laravel SaaS 启动套件
Rector logo

Rector

您无缝升级 Laravel、降低成本和加速创新以取得成功的合作伙伴

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成来增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。在使用熟悉的 Eloquent API 的同时,支持事务、搜索、分析和移动用例。了解 MongoDB 的灵活、现代数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包向您的 Laravel 应用程序添加评论

阅读文章