Homebrew PHP 8.2 不提供 libphp.so,必须改用 php-fpm + proxy_fcgi:启用 mod_proxy 和 mod_proxy_fcgi,删除 LoadModule php_module 行,配置 SetHandler 代理至 php-fpm 监听地址(默认 127.0.0.1:9000 或 Unix socket),并确保 brew services start php@8.2 已运行。

Apache 加载的是 libphp.so,但 Homebrew PHP 8.2 不提供它
PHP 8.2(及 8.1+)默认不再编译 libphp.so 模块,这是 Apache 的传统 mod_php 模式所依赖的。Homebrew 安装的 php@8.2 或 php@8.3 只提供 CLI 二进制和 FPM 服务,不包含 libphp.so。所以即使你取消注释了 LoadModule php_module libexec/apache2/libphp.so,Apache 启动时会报错:Cannot load libexec/apache2/libphp.so into server: dlopen(.../libphp.so, 0x000A): tried: '...' (no such file)。
这不是配置写错了,而是路径下根本没这个文件——macOS 自带的旧 PHP(如 8.0)才带它,而 Homebrew 新版 PHP 已弃用该模式。
必须改用 php-fpm + proxy_fcgi,不能继续用 LoadModule php_module
现代 PHP 与 Apache 协作的标准方式是:Apache 作为反向代理,把 .php 请求转发给独立运行的 php-fpm 进程。Homebrew 安装的 PHP 默认已附带并启用了 php-fpm 服务。
你需要做的是:
立即学习“PHP免费学习笔记(深入)”;
- 确认
php-fpm正在运行:brew services list | grep php(应显示started) - 在
/etc/apache2/httpd.conf中启用必要模块:LoadModule proxy_module libexec/apache2/mod_proxy.so、LoadModule proxy_fcgi_module libexec/apache2/mod_proxy_fcgi.so(去掉前面的#) - 禁用或删除所有
LoadModule php_module ...行(它们已失效) - 在虚拟主机或主配置中添加处理规则,例如:
<FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch>(注意端口需与php-fpm配置一致,默认是9000;也可用 Unix socket 提升性能)
php-fpm 配置端口或 socket 不匹配,导致 503 或空白页
Homebrew 的 php-fpm 默认监听 127.0.0.1:9000,但部分用户会手动改配置为 socket(如 /opt/homebrew/var/run/php-fpm.sock)。如果 Apache 的 proxy:fcgi:// 地址没同步更新,就会连接失败,表现为 503 Service Unavailable 或完全空白。
检查方法:
- 查看
php-fpm实际监听方式:grep -E "^(listen|listen.allowed_clients)" /opt/homebrew/etc/php/*/php-fpm.d/www.conf - 若
listen = /opt/homebrew/var/run/php-fpm.sock,Apache 应配为:SetHandler "proxy:unix:/opt/homebrew/var/run/php-fpm.sock|fcgi://localhost"
- 确保 socket 文件权限允许 Apache(
_www用户)访问:sudo chgrp _www /opt/homebrew/var/run/php-fpm.sock && sudo chmod 660 /opt/homebrew/var/run/php-fpm.sock
重启顺序错误,导致 Apache 看不到新启动的 php-fpm
Apache 和 php-fpm 是两个独立进程。常见错误是只重启 Apache,却没确认 php-fpm 是否真在跑,或者改完 php-fpm 配置后没重载它。
安全操作顺序是:
- 修改完
php-fpm配置后,执行:brew services restart php@8.2 - 验证
php-fpm进程存在:ps aux | grep php-fpm - 再重启 Apache:
sudo apachectl restart - 最后用
curl -I http://localhost/info.php测试 HTTP 状态码,而非仅靠浏览器缓存
最容易被忽略的一点:Apache 的 proxy_fcgi 模块对 socket 路径的解析非常严格——fcgi://localhost 后缀不能少,Unix socket 路径里不能有空格或中文,且 php-fpm.sock 文件必须由 php-fpm 进程创建后才可被 Apache 访问。



















