Я тестирую новый веб-сервер 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 следующим образом: