Laravel 和 MySQL 8:修复 MySQL Server Has Gone Away 错误
发布时间 作者 Paul Redmond
更新时间 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 directoryls: /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 localhostbind-address = 127.0.0.1default_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: rootvolumes: mysql: driver: "local"
在进行了更改之后,您应该能够从 PHP 应用程序连接到 MySQL 8!