macOS 13+已彻底移除系统自带PHP,php -v报command not found即确认无PHP;必须用Homebrew安装php@8.3并配置Apache(brew install httpd)、修改httpd.conf加载libphp.so、启用php.ini中date.timezone、必要扩展及错误报告,且CLI与Apache使用的php.ini路径不同需分别确认。

Mac本地调试PHP环境,不用装MAMP、不用折腾Docker,用系统自带Apache+Homebrew装的PHP就能跑起来——但必须注意:系统自带PHP已从macOS 13.0(Ventura)起被彻底移除,2026年当前所有新装系统默认无PHP,php -v报错不是配置问题,是根本没PHP。
确认系统是否自带PHP并判断能否直接用
执行 php -v,如果返回 command not found: php,说明系统没PHP——这不是你漏配,是Apple从2022年起就逐步弃用系统PHP,2026年已全量移除。别再搜“启用系统PHP模块”,那条路已不存在。
- macOS 12 Monterey及更早版本可能还有
libexec/apache2/libphp.so,但模块绑定的是旧版PHP(如7.3),无法加载新版扩展,phpinfo()里看不到pdo_mysql或opcache基本等于废 - 即使
php -v能输出版本,也要运行which php确认路径:如果是/usr/bin/php,大概率是残存符号链接,实际不可靠;Homebrew安装的PHP路径是/opt/homebrew/bin/php - Apache加载模块时认的是.so文件路径,不是PHP命令路径——所以就算CLI用的是Homebrew版PHP,Apache仍可能调用失败,因为
LoadModule php_module指向的还是系统旧路径
用Homebrew装PHP + Apache并打通HTTP请求链
Homebrew装PHP后,Apache默认不认它,必须手动桥接。关键不是“装两个包”,而是让Apache的mod_php加载Homebrew编译的libphp.so。
- 先装PHP:
brew install php@8.3(推荐8.3,兼容性好,@8.4在2026年8月尚不稳定) - 再装Apache:
brew install httpd(不要用系统apachectl,路径、权限、模块全不匹配) - 编辑
/opt/homebrew/etc/httpd/httpd.conf,找到并取消注释:LoadModule php_module /opt/homebrew/lib/httpd/modules/libphp.so - 在同一文件中添加两行:
AddHandler php-script .php和DirectoryIndex index.php index.html - 重启服务:
brew services restart httpd,别用sudo apachectl,它管不了Homebrew装的服务
php.ini里必须改的三项配置
Homebrew安装后生成的php.ini是模板,默认关掉几乎所有实用功能。不改这三项,mysqli_connect()会报错、中文显示乱码、时区错误导致Carbon等库时间偏移。
立即学习“PHP免费学习笔记(深入)”;
-
date.timezone = Asia/Shanghai(不能只写PRC,PHP 8.3已弃用该缩写) -
extension=openssl、extension=pdo_sqlite、extension=mbstring这三行必须取消注释;pdo_mysql要额外brew install mysql-client再加extension=pdo_mysql -
display_errors = On和error_reporting = E_ALL开发期必开,否则语法错误静默失败,页面空白却不报错
验证时访问localhost失败的三个真实原因
浏览器打开http://localhost/info.php白屏/404/500,90%不是代码问题,是路径或权限卡点。
- 文档根目录不是
/Library/WebServer/Documents——Homebrew版Apache默认是/opt/homebrew/var/www,把info.php放错位置就404 -
info.php里写了phpinf(); ?>(少个o),Apache不会提示语法错误,直接返回空响应,看起来像服务没起来 - PHP扩展加载失败时,Apache日志(
/opt/homebrew/var/log/httpd/error_log)里会有PHP Warning: Module 'xxx' already loaded或undefined symbol: php_json_encode,但浏览器只显示500
最常被忽略的点:Homebrew安装PHP后,php --ini显示的Loaded Configuration File路径,和Apache实际读取的php.ini不是同一个文件——前者是CLI用的,后者是Apache通过libphp.so加载时找的路径,必须检查/opt/homebrew/etc/php/8.3/php.ini是否真被修改且保存。



















