在用Docker之前,我的Laravel工作流很简单,但也很重复。每次想开始一个项目,都得打开终端跑php artisan serve,然后再开一个终端跑npm run dev。它能用,但很繁琐。
Laravel Sail改变了这一切。一句sail up -d,一切就都跑起来了。PHP、数据库、Web服务器,全都在Docker里面。再也不用每次都手动启动开发服务器。
好奇心
有段时间,我开始好奇能不能在Docker之外、直接在macOS上原生跑PHP。老实说,一开始挺让人困惑的。我去年才拿到自己的Mac,对macOS的开发生态完全不熟悉。我不知道该从哪里开始,也不知道有哪些工具可用。第一反应就是去搜"如何在Mac上运行PHP"。
一搜就一头栽进了Homebrew安装PHP、管理多个版本、配置Nginx、手动搭建数据库的兔子洞里。跟我习惯的一句sail up相比,这感觉需要打理的东西实在太多了。
发现DBngin和Laravel Herd
然后我找到了两个改变一切的工具。
DBngin是一款Mac上的免费应用,可以在本地一键启动数据库服务:PostgreSQL、MySQL或Redis。它本身不是数据库管理工具,要管理数据得配合TablePlus(同一个团队做的)使用。DBngin负责跑服务,TablePlus负责浏览和管理数据。在DBngin里点一下Start,数据库就在localhost上跑起来了。
Laravel Herd是一个专门为Laravel打造的原生macOS开发环境。它会自动处理PHP、Nginx和DNS。装好的那一刻起,你的Laravel项目就可以通过your-project.test访问,不用配置,也不用手动启动服务器。它甚至连SSL都帮你搞定了。
恍然大悟的一刻
Herd最让我印象深刻的地方,是站点链接这件事。用Sail的时候,我的项目跑在localhost上;用Herd,它立刻就能在humfurie.test上访问。不用编辑hosts文件,不用配置虚拟主机,它就是直接能用。
开发体验也明显更快了。因为PHP是原生运行,而不是跑在容器里,所以没有Docker文件系统的开销。页面加载更快,artisan命令也是瞬间执行。
那Laravel Valet呢?
如果你在找Herd的免费替代品,有Laravel Valet。实际上,这正是Herd的底层基础:同样的概念(Nginx、DnsMasq、自动.test域名),只是没有图形界面。你通过Composer安装它,一切都在终端里管理。
Herd本质上就是加了一层精致界面、内置PHP版本管理,以及自动SSL之类附加功能的Valet。如果你不介意在命令行里操作,Valet可以免费给你同样的核心体验。
踩过的坑
这次迁移并不是完全无缝的,有几个地方让我卡住了。
数据库连接:我的.env文件是为Docker内部主机名配置的。脱离Docker之后,我需要改成localhost,并确保数据库的配置值都和DBngin实际运行的对得上。
Node模块:我的node_modules是在Docker容器(Linux ARM)里安装的,所以缺少macOS原生二进制文件。重新安装一遍node_modules就解决了。
PHP版本差异:Herd跑的是PHP 8.5,而我的Docker配置用的是PHP 8.4。这暴露出了一些在新版本中被重命名的PDO常量的弃用警告。
广告拦截器:这个是意料之外的。我浏览器的广告拦截器把Vite开发服务器的请求给挡住了,页面加载出来就是一片黑屏,直到我把那个域名加入白名单才解决。
那到底哪个更好?
两者都有各自的用武之地。
Sail更适合团队一致性、CI/CD对齐,以及你想让开发环境完全对应生产环境的场景。如果你用的是Linux,它也是唯一的选择。
Herd加DBngin更适合单人开发、追求速度和简洁的macOS环境。原生性能和自动.test域名让日常工作流更顺畅。
我两个都留着用。Sail作为一个基于Docker的选项留在仓库里用于开发,部署时我还有一套单独的生产环境Docker Compose配置。日常本地开发则由Herd负责。在Sail和Herd之间切换,不过是改一下.env文件指向哪个数据库主机而已。