MacOS 13 Ventura下PHP通过Apache无法连接PostgreSQL但命令行可访问
解决MacOS 13 Ventura下PHP连接PostgreSQL超时问题
问题背景
在MacOS 13 Ventura系统中,已安装PHP 8.2.10及通过Postgres.app安装的PostgreSQL 16,数据库可通过命令行正常查询,浏览器也能正常显示phpinfo()页面,但运行PHP脚本查询数据库时出现超时错误:页面加载时服务器连接已重置。
用户提供的PHP脚本
<?php $host = "host = 127.0.0.1"; $port = "port = 5432"; $dbname = "dbname = DBNAME"; $credentials = "user = USER password = PASS"; $conn = pg_connect( "$host $port $dbname $credentials" ); if(!$conn) { echo "Error : Unable to open database".PHP_EOL; } else { echo "Opened database successfully".PHP_EOL; } ?>
用户对Apache httpd.conf的修改
- 取消注释:
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
- 修改内容:
ServerName localhost <Directory /> AllowOverride none Require all denied </Directory> <IfModule dir_module> DirectoryIndex index.php index.html </IfModule> DocumentRoot "/Library/WebServer/Documents" <Directory "/Library/WebServer/Documents"> Options FollowSymLinks Multiviews MultiviewsMatch Any AllowOverride All Require all granted </Directory>
- 添加内容:
#PHP PHPIniDir "/usr/local/etc/php/8.2/php.ini" LoadModule php_module /usr/local/opt/php/lib/httpd/modules/libphp.so "Vlad Atanasiu Myself" <FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch>
解决步骤
1. 确认PHP的PostgreSQL扩展已启用
- 打开PHP配置文件
/usr/local/etc/php/8.2/php.ini,找到以下两行,确保前面没有注释符;:extension=pgsql extension=pdo_pgsql - 保存文件后重启Apache:
sudo apachectl restart - 刷新phpinfo页面,搜索
pgsql关键字,确认扩展已成功加载。
2. 检查PostgreSQL监听配置
- 打开Postgres.app对应的PostgreSQL配置文件(路径通常为
~/Library/Application Support/Postgres/var-16/postgresql.conf) - 找到
listen_addresses参数,确保其值为'*'或'127.0.0.1'(允许本地网络连接),而不是仅局限于本地套接字 - 确认
port参数设置为5432 - 重启Postgres.app使配置生效
3. 优化数据库连接字符串
当前连接字符串格式存在多余空格,可能导致解析异常,建议简化为:
$conn = pg_connect("host=127.0.0.1 port=5432 dbname=DBNAME user=USER password=PASS");
4. 验证Apache运行用户的数据库访问权限
MacOS下Apache默认以_www用户运行,需确认该用户能正常连接PostgreSQL:
- 在终端执行以下命令,模拟Apache用户连接数据库:
sudo -u _www psql -h 127.0.0.1 -U USER DBNAME - 输入密码后若能成功连接,说明权限无问题;若连接失败,需调整PostgreSQL的用户权限或
pg_hba.conf配置。
5. 查看错误日志定位问题
- Apache错误日志:路径为
/var/log/apache2/error_log,可查看服务器层面的连接异常信息 - PHP错误日志:若未启用,先在
php.ini中添加以下配置并重启Apache:
运行出错的PHP脚本后,查看日志获取更详细的错误原因。error_log = /usr/local/var/log/php/8.2/php_error.log
内容的提问来源于stack exchange,提问作者Vlad Atanasiu
相关产品推荐
相关产品推荐

