必须先确认 Apache 来源:/usr/sbin/apachectl 为系统自带,brew services list 显示 httpd 为 Homebrew 版;二者配置路径、模块路径、php.ini 位置均不同,混用必报错。

Mac 自带 Apache 和 PHP,但默认不启用 PHP 解析,且配置路径、模块名、权限逻辑与 Homebrew 安装的版本完全不同——直接照搬网上“改 httpd.conf 去注释 libphp.so”的教程,90% 会遇到 500 错误或 “It works!” 但 phpinfo() 不执行。
确认你用的是系统自带 Apache 还是 Homebrew 的 httpd
先看清楚自己在用哪个 Apache,这是所有问题的起点:
- 运行
which apachectl:如果输出/usr/sbin/apachectl,说明用的是 macOS 自带 Apache(路径在/etc/apache2/) - 运行
brew services list | grep httpd:如果显示httpd started,说明你装了 Homebrew 版 Apache(路径在/opt/homebrew/etc/httpd/) - 两者不能混用:比如用系统
apachectl去加载 Homebrew 编译的libphp.so,会报Cannot load /opt/homebrew/lib/httpd/modules/libphp.so into server
系统自带 Apache 启用 PHP 的关键三步
macOS 12+(Monterey 及更新)已移除内置 PHP,但 10.15–12.6 仍带 PHP 7.3 或 8.1(取决于系统版本),启用它需严格匹配模块路径和配置顺序:
- 编辑
/etc/apache2/httpd.conf,取消注释这一行:LoadModule php_module libexec/apache2/libphp.so(注意不是php5_module或php7_module) - 在
DirectoryIndex行末尾加上index.php,例如:DirectoryIndex index.html index.php - 确保
/Library/WebServer/Documents/目录有读权限,且对应<directory></directory>块中包含AllowOverride All和Require all granted(旧版用Order allow,deny+Allow from all) - 重启服务:
sudo apachectl restart,不是start;若提示httpd not running,先sudo apachectl start
Homebrew 安装的 PHP + Apache 配置常见断点
Homebrew 的 php@8.3 和 httpd 是独立编译的,模块路径、PHP 配置文件位置、CLI 与 Web 使用的 php.ini 完全分离:
立即学习“PHP免费学习笔记(深入)”;
-
libphp.so路径一定是/opt/homebrew/lib/httpd/modules/libphp.so,绝不是系统路径;修改/opt/homebrew/etc/httpd/httpd.conf,不是/etc/apache2/ - PHP 配置文件是
/opt/homebrew/etc/php/8.3/php.ini,改完后必须重启httpd(brew services restart httpd),改php.ini不重启 Apache 无效 - CLI 下运行
php -v显示的版本,和浏览器里phpinfo()显示的版本可能不一致——检查which php和php --ini,再对比phpinfo()中的Loaded Configuration File - 扩展启用必须写全路径或确保 extension_dir 正确,例如:
extension="/opt/homebrew/lib/php/20230831/mbstring.so",或先设extension_dir = "/opt/homebrew/lib/php/20230831"再写extension=mbstring
测试文件放哪、怎么访问才真正有效
路径错一个字符、权限少一个 granted,就会 403 或 500:
- 系统 Apache 默认根目录是
/Library/WebServer/Documents/,放info.php后访问http://localhost/info.php - Homebrew Apache 默认根目录是
/opt/homebrew/var/www/,但首次启动后该目录可能不存在,需手动创建:mkdir -p /opt/homebrew/var/www - 用户级站点(
~/Sites)需要额外配置:/etc/apache2/users/$(whoami).conf,且该文件权限必须是644,内容里<directory></directory>路径要和实际一致,并含Require all granted - 测试时不要只看
It works!,一定要新建一个info.php,内容只有<?php phpinfo(); ?>,然后看浏览器输出里有没有Loaded Configuration File和Server API是Apache 2.0 Handler
最易被忽略的是模块路径与配置文件的物理归属关系——系统 Apache 找不到 Homebrew 的 libphp.so,Homebrew Apache 加载不了系统的 php.ini,二者连进程都不同。动手前先 ps aux | grep httpd 看清 PID 对应哪个二进制,比盲目改配置省两小时。



















