mysqliはPHP 7.4でcache_sha2_passwordをサポートしていますか?


8

PHP 7.3からPHP 7.4にアップグレードしようとすると、次のエラーが発生しました。

cache_sha2 auth 109の実行中の予期しないサーバー応答

私が見ると、これはPHP 7.4 MySQLiがcaching_sha2_passwordプラグインを使用しようとしていることを示しています。この記事は、PHP MySQLiがプラグインをサポートしていないことを示しています(プラグインの将来のサポートも示唆しています)が、PHP 7.4は新しく、使用しようとしているようなので、動作するはずです。また、エラーメッセージは、サポートされていなかった場合とは異なります(アクセス拒否認証方法が不明)。

そこで、MySQL認証プラグインをcaching_sha2_password(以前と同じパスワードを使用して)に変更しました。

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '';
FLUSH PRIVILEGES;

しかし、これは別のエラーを引き起こしました:

ユーザー 'root' @ 'localhost'のアクセスが拒否されました(パスワードを使用:YES)。

PHP 7.3に戻すとmysql_native_password、再び機能します。

両方のプラグイン、同じWebサイトに同じパスワードを使用し、同じphp.iniの変更を適用しました。ただし、mysqli構成は変更しませんでした。MySQLのログには何も表示されず、apache2ログには「アクセスが拒否されました」というエラーメッセージのみが表示されます。

php7.4-mysqliはサポートしていcaching_sha2_passwordますか?はい

パスワードが拒否されたのはなぜですか、どうすれば修正できますか? フォローアップの質問を見る

また、MySQLiがプラグインをまだサポートしていない場合:どうすれば使用できmysql_native_passwordますか?

回答:


5

私はこれをテストしました。PHP7.4のmysqliは、caching_sha2_passwordをサポートしています。

php -v
PHP 7.4.0 (cli) (built: Nov 29 2019 16:18:44) ( NTS )

以下は、Dockerコンテナで実行されているMySQL 8.0.17に接続するために作成した簡単なPHPスクリプトです(ポート6603を使用)。

<?php
error_reporting(E_ALL);
$conn = new mysqli('127.0.0.1', 'root', 'root', '', 6603);
$result = $conn->query("SELECT NOW()");
$now = $result->fetch_row()[0];
echo "$now\n";

私のMySQLインスタンスがcaching_sha2_passwordを使用していることを確認しました:

mysql> select user,host,plugin from mysql.user where user='root';
+------+-----------+-----------------------+
| user | host      | plugin                |
+------+-----------+-----------------------+
| root | %         | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------+-----------+-----------------------+

mysql> select @@default_authentication_plugin;
+---------------------------------+
| @@default_authentication_plugin |
+---------------------------------+
| caching_sha2_password           |
+---------------------------------+

PHPスクリプトを実行すると、成功しました。

php my.php
2019-12-08 18:11:58

しかし、パスワードを''あなたのように変更しようとしたところ、同じエラーを再現できました。

PHP警告:mysqli :: __ construct():cache_sha2 auth実行中の予期しないサーバー応答:/Users/bkarwin/Documents/SO/my.phpの5行目

パスワードを復元し、空白以外の文字列に設定すると、問題が解決しました。

空のパスワードは使用しないでください。


面白い。私は空白のパスワードを使用しませんでした(申し訳ありませんが、それを明確にする必要がありました)。しかし、それが機能することを知っていることはすでに役立ちます。もう一度やり直し、回避できるかどうかを確認してから、Access Deniedまた戻ってきます。
気に

で空のパスワードを設定しますALTER USER ... BY ''。同じことをしようとすると、空白のパスワードが設定されました。
Bill Karwin

... BY '';短縮版でしたが、実際に入力しました... BY 'mySecretPassword';
Minding

もう一度試したところ、Access Denied文字通りパスワードをコピーしたにもかかわらず、同じ問題が発生しました。私のPHPは実際にはあなたの1日前にビルドされました。PHP 7.4.0 (cli) (built: Nov 28 2019 07:27:06) ( NTS )たぶんそれは単なるバグですか?
気に

1
再現できないのでわかりません。同じ日にPHPをコンパイルして、1日おきにコンパイルしても違いが出ないことを願っています。
Bill Karwin

3

これが発生する可能性があるいくつかの方法があります

  1. mysql_client認証の方法を使用しています。これは、MySQL CLIインターフェースを介してMySQLに接続することにより、PHPがネイティブに行う方法でした。MySQL独自のクライアントは、常に独自の認証方法をサポートします。
  2. 7.4でMySQLNDを使用しています。どうやらこれは、ネイティブドライバに改善しました抜き打ち行ってきました

    はい、これはext / hashに強く依存しているため、現時点では7.4のみです。

    まだいくつかの問題が考えられます。


私を本当に混乱させているのは、すべてが送信部分で正常に機能しているが、私のパスワードが拒否されていることです。私は文字通りそれをコピーして貼り付け、mysql_native_passwordそしてcaching_sha2_password最初のものだけが機能します
気に

ネイティブドライバーとmysqlクライアントを切り替える方法を知っていますか?
気に

サーバーの設定方法によって異なります。PHPマニュアルは、一般的なセットアップの一部の上に行きます。
Machavity、

ありがとう、私はを使用mysqlndしていますが、これが問題になる可能性があるので、完全なサポートを待つつもりです。
気に

私のフォローアップの質問をチェックしいただければ幸いです。
気に
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.