在使用PHP编写web页面访问Postgres数据库时,遇到了apache 没有正确加载pdo_pgsql.so的问题, 把它记录下来以备用。
通过web访问php页面时,页面没有反应, 查看http log时出现下面的错误:
PHP Fatal error: Call to undefined function pg_connect()
但是在命令行运行php程序访问postgres测试是成功的, 没有发现问题。
网上搜索,都是说php访问postgres 安装了php-pgsql就可以了。 但我已经通过yum安装了php-pgsql, 查看/etc/php.ini, /etc/php.d/pdo_pgsql.ini都是配置正确的。
[root@localhost php.d]# cat pdo_pgsql.ini
; Enable pdo_pgsql extension module
extension=pdo_pgsql.so
phpinfo()也显示加载了pdo_pgsql.ini, pgsql.ini , 但在PDO节里没有看到Postgres。
后来想到会不会是SElinux的问题, 把SElinux 关了,再重启apache,
[root@localhost php.d]# setenforce 0
service httpd restart
重启运行phpinfo(), 就看到postgres 正确加载了。
回过来查看以前apache 的error_log, 确实是php 在加载pdo_pgsql.so 时出现了由于访问权限引起的问题。
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/pdo_pgsql.so' - libpq.so.5: failed to map segment from shared object: Permission denied in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/pgsql.so' - libpq.so.5: failed to map segment from shared object: Permission denied in Unknown on line 0
把SElinux 关了后, 启动apache时就没有这个错误了,php也成功加载了pgsql。
在实际应用中就需要关闭SElinux,或者重设libpq.so.5的权限。