Назад | Перейти на главную страницу

PHP 7.2.8 PDO не может подключиться к MySQL 8.0.12 (GA) в стеке AWS EC2 LEMP

Я тестирую новый веб-сервер LEMP, построенный на Ubuntu Server 18.04 LTS, NGINX 1.14, PHP 7.2.8 и MySQL 8.0.12. Это экземпляр AWS EC2, использующий официальный Canonical AMI. Веб и PHP работают по назначению, за исключением подключения к базе данных. Но я не могу подключиться к базе данных MySQL, используя настройки и функции PDO, которые хорошо работали в других случаях (MySQL 5.7 через PHP 7.1).

Я могу надежно подключиться к серверу (MySQL через SSH) в терминале, используя те же учетные данные, которые пытается использовать PDO. Также надежно удаленно с помощью MySQL Workbench и тех же учетных данных. На сервере нет межсетевого экрана. Брандмауэр работает только через группы безопасности Amazon. С открытым портом 3306 PHP по-прежнему не будет подключаться с помощью PDO. Не пробовал использовать MySQLi, но одна из целей этого - определить и задокументировать, как подключиться через PDO в этой среде. Так что это не было бы решением.

Я понимаю, что защита паролем изменилась в MySQL 8 (и я решил использовать новый более надежный пароль по умолчанию во время установки). Но я также получил впечатление от http://php.net/manual/en/ref.pdo-mysql.php что с PHP 7.2.4 это должно работать ... Я действительно не понимаю, что они пытаются сказать в соответствующих абзацах там ...

Ожидается, что это еще не сработает?

РЕДАКТИРОВАТЬ: Удалена информация о конфигурации и устранении неполадок, которая оказалась неактуальной. Надеюсь, что это более чистое / более короткое изменение вопроса будет более полезным для тех, кто найдет его позже.

Текст на странице документации PHP, на которую вы ссылаетесь:

MySQL 8

При запуске версии PHP до 7.1.16 или PHP 7.2 до 7.2.4 установите плагин пароля по умолчанию для MySQL 8 Server на mysql_native_password иначе вы увидите ошибки, похожие на Сервер запросил метод аутентификации, неизвестный клиенту [caching_sha2_password] даже если caching_sha2_password не используется.

Это связано с тем, что MySQL 8 по умолчанию использует caching_sha2_password, плагин, который не распознается более старыми версиями PHP (mysqlnd). Вместо этого измените его, установив default_authentication_plugin = mysql_native_password в my.cnf. В caching_sha2_password плагин будет поддерживаться в будущих версиях PHP. А пока mysql_xdevapi расширение поддерживает его.

Это не означает, что PHP в настоящее время поддерживает caching_sha2_password. Это не. Это означает, что PHP больше не выдает фатальные ошибки при подключении к серверу MySQL 8.0, который объявляет о поддержке caching_sha2_password.

Вы можете установить названное расширение PECL, если хотите, но оно имеет другой API для mysqlnd, поэтому он не является заменой и не будет работать с существующим кодом PHP, который использует API mysqlnd.

На данный момент, пока не будет выпущена новая версия PHP mysqlnd, которая фактически поддерживает аутентификацию с помощью caching_sha2_password, ваш единственный вариант - не использовать ее, вернувшись к mysql_native_password, как описано в документации.

Дальнейшее исследование позволило нам узнать, что PHP пока не поддерживает caching_sha2_authentication, поэтому mysql пришлось вернуться к родному.

НОТА: Нельзя просто создать учетные записи WITH mysql_native_password, но по умолчанию должен быть mysql_native_password.

РЕДАКТИРОВАТЬ: Вырезанная информация, которая, как оказалось, не имела отношения к проблеме.

Вы можете изменить метод аутентификации MYsql8 по умолчанию в MySQL Workbench следующим образом:

  1. Открытие рабочей среды MySQL от имени администратора
  2. Сначала переходим к экрану файла параметров, выделенному цифрой 1 рядом с ним на связанном снимке экрана.
  3. Прокрутите, чтобы затем изменить метод аутентификации, в раскрывающемся списке, выделенном цифрой 2 рядом с ним, и нажмите «Применить» в правом нижнем углу.