尝试将 Symfony 3.2/Doctrine 应用程序部署到 Swisscom PaaS。
已安装 Buildpack(PHP 7、httpd 等),composer 正在运行并安装依赖项,但是当调用 composer after-commands 时,例如 cache:clear 我得到:
[Doctrine\DBAL\Exception\ConnectionException]
An exception occured in driver: SQLSTATE[HY000] [2002] Connection refused
我的manifest.yml:
applications:
- services:
- dbservice
buildpack: php_buildpack
host: myapp
name: MyApp
instances: 1
memory: 640M
env:
SYMFONY_ENV: prod
PHP_INI_SCAN_DIR: .bp-config/php/conf.d
我的options.json:
"WEB_SERVER": "httpd",
"COMPOSER_INSTALL_OPTIONS": ["--no-dev --optimize-autoloader --no-progress --no-interaction"],
"COMPOSER_VENDOR_DIR": "vendor",
"SYMFONY_ENV": "prod",
"WEBDIR": "web",
"PHP_MODULES": "fpm",
"PHP_VERSION": "{PHP_70_LATEST}",
"PHP_EXTENSIONS": [
"bz2",
"zlib",
"curl",
"mcrypt",
"openssl",
"mbstring",
"pdo",
"pdo_mysql"
],
"ZEND_EXTENSIONS": [
"opcache"
]
这就是我从 VCAP 读取数据库凭据并在 Symfony 中设置参数的方式(这与 VCAPSERVICES env vars 的本地设置完美配合):
$vcapServices = json_decode($_ENV['VCAP_SERVICES']);
$container->setParameter('database_driver', 'pdo_mysql');
$db = $vcapServices->{'mariadb'}[0]->credentials;
$container->setParameter('database_host', $db->host);
$container->setParameter('database_port', $db->port);
$container->setParameter('database_name', $db->name);
$container->setParameter('database_user', $db->username);
$container->setParameter('database_password', $db->password);
// Just for debug:
echo 'User: ';
var_dump($container->getParameter('database_user'));
echo 'Db: ';
var_dump($db);
服务正在运行,两个 var_dump 都提供预期值。但仍然拒绝连接。
我究竟做错了什么?
****EDIT**** 一个类似的问题似乎在这里,但没有解决方案:Cloud Foundry p-mysql
****编辑****
我一直调试到调用 PDO 构造函数的语句。
使用以下参数调用它:
$dsn = mysql:host=10.0.20.18;port=3306;dbname=CF_DB922DD3_CACB_4344_9948_746E585732B5;
$username = "myrealusername"; // as looked up in VCAP_SERVICES
$password = "myrealpassword"; // as looked up in VCAP_SERVICES
$options = array();
任何看起来都与在服务绑定的 Web 控制台中看到的完全一样。
成功连接是否需要unix_socket ?
****编辑****
由于 Symfony 正在使用一些 composer post-install-commands(在这种情况下,例如清除和预热缓存),这需要已经工作的数据库连接,只要容器没有完全构建,cloudfoundry 的 DB 服务不支持此连接并部署?
我的想法不多了。