我尝试连接只支持SSL连接的Heroku Postgres。 SSL连接可以从其他工具(Postico)和编程环境(Node.js)中正常工作,但是当从PHP连接时,我总是会收到此错误:
sslmode value "require" invalid when SSL support is not compiled
我的本地环境是OS X,所有软件包都使用自制软件安装并具有SSL支持。 pgsql也支持基于phpinfo()输出的SSL支持:
SSL support => enabled
Libpq和Postgres使用SSL支持进行编译:
-lpgcommon -lpgport -lssl -lcrypto -lz -lreadline -lm
PHP版本:7.2.5(也试过5.6,7.1分支) 本地Postgres和libpq版本:10.3
尝试了我可以解决的所有解决方案,但无法使此连接正常工作。当通过自制软件安装时,Postgres支持从PHP 7.2.5开箱即用。没有更多单独的php-pgsql / php-pdo-pgsql包。
答案 0 :(得分:3)
错误信息很明显,它来自PostgreSQL的libpq
中的这段代码:
#ifndef USE_SSL
switch (conn->sslmode[0])
{
case 'a': /* "allow" */
case 'p': /* "prefer" */
/*
* warn user that an SSL connection will never be negotiated
* since SSL was not compiled in?
*/
break;
case 'r': /* "require" */
case 'v': /* "verify-ca" or "verify-full" */
conn->status = CONNECTION_BAD;
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext("sslmode value \"%s\" invalid when SSL support is not compiled in\n"),
conn->sslmode);
return false;
}
#endif
该代码仅在PostgreSQL 未配置--with-openssl
时编译。
您可以使用pg_config
验证(如果您没有从源代码安装PostgreSQL,则可能需要安装“dev”或“devel”软件包):
pg_config --configure
输出不包含--with-openssl
。
很可能PHP是使用SSL支持构建的,但PostgreSQL不是。
由于您说PostgreSQL是使用SSL支持编译的,因此对该行为的一种解释是您的计算机上安装了多个PostgreSQL,而PHP使用的是没有SSL支持的构建。尝试查找系统中名为libpq.*
的所有文件!
答案 1 :(得分:0)
我遇到了同样的问题,即使用MAMP和PHP7.2.1在Heroku上连接到PostgreSQL。即使在phpinfo()中显示为已启用openSSL和pgsql SSL支持,也保持在未编译SSL支持时获取“ sslmode值” require”无效”。通过自制软件安装postgresql对我来说解决了这个问题。
brew install postgresql
想发贴,以防其他遇到相同问题的人使用。