mac 上用虚拟机搭 php 服务器环境已基本没必要,docker 容器方案更轻量、快速、可复现,资源开销小、启动快、文件共享流畅、端口映射稳定,尤其适合日常开发、本地调试和 ci 前验证。

直接说结论:Mac 上用虚拟机搭 PHP 服务器环境,现在基本没必要了。资源开销大、启动慢、文件共享卡顿、端口映射容易出错——这些问题在 Docker 容器方案里都已解决得更干净。
如果你已经买了 Parallels 或 VMware,或者正在用 VirtualBox 跑一个 Ubuntu/Debian 虚拟机跑 PHP+MySQL+Nginx,那不是不能用,而是「成本远高于收益」。尤其对日常开发、本地调试、CI 前验证这类场景,容器更轻、更快、更可复现。
下面聚焦三个真实高频问题,告诉你怎么绕过虚拟机、直接落地:
为什么 docker run -d -p 80:80 nginx 不显示 phpinfo()
因为官方 nginx 镜像默认不带 PHP,它只负责 HTTP 分发,php-fpm 是另一个独立进程,必须显式连接。
- 错误做法:把
index.php放进/usr/share/nginx/html,以为 Nginx 能直接解析 —— 实际会下载文件或返回 500 - 正确做法:启动两个容器,用 Docker 网络打通
nginx和php-fpm,并在nginx.conf里配fastcgi_pass php-fpm:9000 - 偷懒但可靠的做法:用预编译镜像(如
registry.cn-hangzhou.aliyuncs.com/btpanel/baota:latest),它内部已桥接好 Nginx+PHP-FPM+MySQL - 注意:Mac 上
localhost可以访问,但容器内127.0.0.1指向自己,不能用来连宿主机的 php-fpm;跨容器通信必须用服务名
brew install php 后 sudo php-fpm 报错 “Unable to open log file”
这是 Mac 自带或 Homebrew 安装的 php-fpm 默认配置和权限没对齐导致的,不是 PHP 本身坏了。
- 常见报错:
ERROR: failed to open error_log file '/usr/local/var/log/php-fpm.log': No such file or directory - 先建日志目录:
sudo mkdir -p /usr/local/var/log - 再确认
php-fpm.conf里error_log和pid路径是否可写,典型路径是:/usr/local/etc/php/8.3/php-fpm.conf(版本号随你装的变) - 如果用的是系统自带 PHP(macOS 14+ 已移除),
php-fpm会被禁用;Homebrew 安装后需手动启服务:brew services start php - 别硬改
/private/etc/php-fpm.conf—— Homebrew 管理的 PHP 不读那个路径,改了也无效
docker-compose.yml 里 volumes 映射后 PHP 文件修改不生效
不是代码没保存,也不是容器没重启,而是 macOS 的文件系统事件通知(inotify)在挂载卷时默认被 Docker Desktop 屏蔽了,Laravel Mix/Vue CLI/Webpack Dev Server 这类监听器就收不到变更。
- 现象:改了
index.php,刷新浏览器还是旧内容;tail -f日志也没反应 - 临时解法:加
notify参数到 webpack 或 Laravel 的 dev 命令里,比如npm run watch -- --watch-options-poll=1000 - 根治办法:在 Docker Desktop → Settings → Resources → File sharing,确认你的项目目录(如
~/baota/www)已在共享列表里;再勾选Use the new Virtualization Framework(M1/M2 必开) - 别用
:ro(只读挂载),除非你真不想让容器写文件;开发场景一律用读写模式
真正麻烦的从来不是“怎么装”,而是“怎么让改完的代码立刻生效”“怎么让 MySQL 数据不随着容器删掉就丢”“怎么让 Xdebug 断点打进去”。这些细节藏在 volume 权限、网络模型、时区同步、PHP opcache 开关里——它们不报错,但会让开发节奏断档。动手前,先想清楚你要的是“能跑”,还是“能高效迭代”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











