Я пытаюсь перенести свое приложение на Heroku, но у меня проблемы с доступом к базе данных через PHP. Я могу получить доступ к базе данных AWS с моей машины локально, но когда я развертываю ее в Heroku, она терпит неудачу.
Я следил за указаниями на главной странице: https://devcenter.heroku.com/articles/amazon-rds
И я пробовал другие потоки на SO/AWS:
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_MySQL.html#MySQL.Concepts.SSLSupport
Я также видел инструкции здесь: https://devcenter.heroku.com/articles/getting-started-with-php#provision-a-database
Но я пытаюсь портировать существующее приложение, поэтому мне нужно придерживаться существующего синтаксиса PDO. Я пытаюсь заставить это работать:
$dbInfo = getenv('DATABASE_URL');
try{
$dbh = new PDO($dbInfo);
echo json_encode(array('outcome' => true));
}
catch(PDOException $ex){
echo json_encode(array('outcome' => false, 'message' => 'Unable to connect'));
}
Я правильно настроил настройку среды и могу запустить parse_url для доступа ко всем элементам массива; У меня также есть amazon-rds-ca-cert.pem, находящийся в папке config.
Я могу войти в систему удаленно (через SequelPro) и запустить в диспетчере запросов следующее, чтобы попытаться принудительно выполнить SSL-сертификат:
GRANT USAGE ON *.* TO 'username'@'%' REQUIRE SSL;
Но когда я намеренно пропущу имя сертификата, моя локальная база данных все еще может подключиться, что заставляет меня думать, может быть, я что-то упустил с требованием.
Догадаться; необходимо вручную указать сертификат SSL в PDO-соединении. Также были незначительные ошибки в синтаксисе PDO.
try{
$dbh = new PDO("mysql:host=$pdohost;dbname=$pdodb", $pdouser, $pdopass, array(
PDO::MYSQL_ATTR_SSL_CA =>'path/to/combined-cert.pem'
));
echo json_encode(array('outcome' => true));
}
catch(PDOException $ex){
echo $ex;
echo json_encode(array('outcome' => false, 'message' => 'Unable to connect'));
}
Также необходимо обязательно обновить входящие правила AWS до 0.0.0.0/0
чтобы разрешить доступ к Heroku.