Mac上PHP开发环境搭建实战:FlyEnv一站式集成方案
直接在 Mac 上搞定 PHP 开发环境这事说起来简单做起来是真折腾。装个 Homebrew 可能卡在更新源上报错用 MAMP 又觉得界面老、版本切换不顺手手动配 Nginx 加 PHP-FPM 更是能耗费一整个下午。我用过 Laravel Valet、Docker、还有各种一键安装包最后在 FlyEnv 上稳了下来。这篇就和你聊聊为什么我最终选它以及从安装到建站、配库、切版本、排错的全流程实测记录。如果你是刚接触 PHP 的 Mac 用户或者正被手头环境搞得焦头烂额这篇应该能帮你省下不少时间。FlyEnv 是一款在 Mac 和 Windows 上都能用的图形化 PHP 集成开发环境工具。它不像 Docker 那样要写一堆配置文件也不像手动编译那样处处是坑。它能做到的事情很直接你选一个 PHP 版本它给你配好 PHP-FPM你建一个站点它自动把 Nginx 配置和 HTTPS 证书都处理好你再点几下MySQL、Redis、MongoDB 这些服务就起来了。整个过程基本靠鼠标点击完成适合那些想专心写业务代码、不想把生命浪费在brew install和vim nginx.conf上的开发者。这篇文章我会按照自己的实际使用路径来写先讲我更换环境的决策过程和选型对比再带你完整走一遍 FlyEnv 的安装、启动和 PHP 版本管理接着用一个真实项目演示从创建站点到数据库连接的完整流程最后整理我在使用中遇到的高频问题和排查思路。如果你想跳过踩坑环节直接看结论可以只看第一部分的选型对比和最后一部分的问题速查表但如果你打算长期在这台 Mac 上开发 PHP建议你从头到尾读一遍很多细节我在后面都会提到。1. 内容整体设计与思路拆解1.1 为什么我老老实实回到“一键环境”先交代一下背景。我平时在 Mac 上写 PHP 项目用过很长时间的 Laravel Valet搭配 Homebrew 装的 PHP 和 MySQL。Valet 的思路很优雅它不管理 PHP 本身只负责把请求代理到对应的 PHP-FPM 进程上站点目录直接映射到~/Sites下面。好处是轻、快命令敲两下就能把站点跑起来。坏处是版本切换麻烦装新扩展要自己编译而且一旦 Homebrew 的 PHP 包升级可能导致你的站点瞬间起不来因为这个原因我被迫重启过很多次本地服务。后来也试过 Docker用docker-compose把php-fpm、nginx、mysql这三个容器编排好理论上隔离性很好也方便模拟线上环境。但我个人遇到两个痛点一是容器的文件挂载在 macOS 上性能一般尤其是依赖多的 Laravel 项目刷个页面能明显感觉到卡顿二是 Docker 的镜像源在国内网络环境下偶尔抽风拉镜像的时间比写代码的时间都长。用了一阵子之后我觉得本地开发的核心是“快速、流畅、好调试”不是我配了一套环境要去公司复现。这时候我重新审视 FernServer、phpStudy 这类集成面板最后发现了 FlyEnv实测了两个月整体感受很不错。1.2 FlyEnv 和几种主流方案的正面比较我在选型的时候列过一个简单的对比表把 FlyEnv、Valet、Docker、MAMP、手动编译这几个方案横着比了一遍。对我来说影响决策的有四个因素部署效率、PHP 版本切换顺手程度、服务整合度以及日常维护成本。方案部署效率版本切换服务整合度维护成本FlyEnv高图形点击即可高一个界面切版本高Nginx/Apache/MySQL/Redis 内置低服务状态可视Laravel Valet高命令操作中依赖系统 PHP 或手动切换低只做代理Caddy 或 Nginx 单独管中Homebrew 更新易受影响Docker中需懂 Dockerfile/Compose高可多容器并行高但编排有门槛中镜像维护有成本MAMP中安装即用中按版本独立中界面老功能偏基础低手动编译极低需大量时间低编译慢低所有组件都要自己配高FlyEnv 相对 MAMP 来说界面现代化很多而且 PHP 版本覆盖更广从 5.6 到 8.3 都有几个版本之间切换非常顺滑。对刚入门的人来说FlyEnv 的图形化操作几乎零门槛对老手来说它保留了自定义配置的入口不会让你觉得束手束脚。它实质上是把以前需要命令行手动完成的一整套流程封装成了点按操作背后的 Nginx 配置、PHP-FPM 进程管理、SSL 证书生成它都替你处理好了。这正是“一站式”这个定位的来源。2. 核心细节解析与实操要点2.1 下载安装前你要知道的几件事FlyEnv 官网会提供对应平台的安装包你进去之后直接下载 Mac 版就行。安装包大概是几十 MB 的大小不会出现下载到一半就断掉的情况。安装过程很简单把应用拖进 Applications 文件夹就算完成。但有几件事我建议你先做好第一检查 macOS 的版本。FlyEnv 对系统版本有一定要求如果你还停留在 macOS 10.13 或更老的版本建议先升级系统再安装。我用的是 macOS 14 的机器运行非常稳定朋友在 macOS 12 上测试也没发现问题。第二确保你的 Mac 没有装过冲突的服务。如果你以前手动装过 Nginx、MySQL 或者 PHP-FPM并且它们还在后台运行建议先用命令停掉防止端口被占用。具体操作是执行sudo pkill -f nginx sudo pkill -f mysql sudo pkill -f php-fpm这不是必选步骤如果你之前的环境已经坏到不想再用的程度直接跳过也没关系FlyEnv 会在端口被占用时给出错误提示到时候再处理也不迟。第三关闭系统的安全限制。从网上下载的未签名应用或新下载的开发者工具macOS 可能会弹出警告。你需要在“系统设置 - 隐私与安全性”里手动允许 FlyEnv 运行。如果安装后打不开先别急着重装去这个设置页面看看。2.2 首次启动与主界面认识第一次打开 FlyEnv界面会分成三个主要区域左边是服务列表中间是站点管理右边是配置面板。整体布局很直观不用看教程也能猜个大概。如果有“本机环境检测”之类的提示我建议你运行一下它会把缺少的依赖或端口冲突一次性列出来省得后面出问题再回头排查。我第一次启动时它提示我安装 PHP 7.4 和 PHP 8.2 两个版本。这正好符合我预期直接点确认就行。FlyEnv 会自己下载对应的 PHP 解释器、PHP-FPM 和扩展不需要你手动编译任何一个模块。这也意味着你不再需要因为一个phpize报错去搜索一整晚的解决方案。你可以在“设置”里看到一个 PHP 版本列表默认情况下它会展示已安装的所有版本。选中一个版本后这个版本的 PHP 会成为全局 CLI 环境你在终端里执行php -v看到的就是你选中的版本。想要返回系统自带的 PHP再切回去就行FlyEnv 不会强行修改你的系统环境所有组件都运行在它自己的目录里。2.3 PHP 版本切换背后的逻辑很多人关心 FlyEnv 怎么做到多个 PHP 版本自由切换的。其实原理并不复杂只是它帮你把繁琐的链路都打通了。FlyEnv 在启动某版本的 PHP-FPM 时会读取该版本对应的一组配置文件和扩展目录。Nginx 的fastcgi_pass指向的地址也会跟着改变可能是127.0.0.1:9001对应 PHP 8.2127.0.0.1:9002对应 PHP 7.4。你切版本的时候它实际上是在调整 Nginx 配置里fastcgi_pass这一行然后重新加载 Nginx 和 PHP-FPM。这比你在终端里手动改配置再重启服务要稳妥得多因为它是程序化地修改不会出现少改一个引号导致整个服务挂掉的情况。同时FlyEnv 会动态调整PATH环境变量里面的 PHP 软链接保证你在终端里用php artisan之类的命令时调用的是当前选中的版本。这两个机制加起来就实现了“界面切版本终端和 Web 同步生效”的效果。提示如果你切完版本之后php -v仍然显示旧版本先检查终端有没有复用旧 shell。执行source ~/.zshrc或者重开一个终端窗口再看。3. 实操过程与核心环节实现3.1 用 FlyEnv 创建一个 PHP 项目这部分我用一个实际场景来演示。假设我现在要为客户的“图书管理系统”新建一个本地开发站点这个项目需要 PHP 8.2、MySQL 数据库还有 Redis 做缓存。打开 FlyEnv 后先看左边服务列表把Nginx、MySQL、Redis三个服务的开关都打开。服务状态从灰色变成绿色表示启动成功。如果你看到红色或黄色警告这可能表示端口被占用或者服务初始化失败后面的问题排查章节会详细讲。接着进入“站点”区域点击创建站点的按钮。表单里需要填几个信息站点名称、根目录路径、PHP 版本和绑定域名。我填写的例子如下站点名称bookms 根目录/Users/mac/Sites/bookms/public PHP 版本8.2 绑定域名bookms.test站点名称我用的是简单英文小写和数字不要带空格或特殊符号因为这个名字会用来生成配置文件名和日志文件名。根目录指向 Laravel 项目的public目录FlyEnv 会自动在里面查找index.php。绑定域名你可以按喜好来.test后缀比较常见FlyEnv 会自动帮你把.test域名的解析指向127.0.0.1并且自动生成一份自签名 SSL 证书也就是说你直接访问https://bookms.test就可以不需要自己再去折腾证书。创建完成后浏览器直接打开https://bookms.test如果项目代码没问题你就能看到 Laravel 默认的欢迎页面。整个过程不超过两分钟。3.2 MySQL 的初始化和数据库导入很多刚上手的朋友会在 MySQL 这里卡住因为不清楚默认的用户名和密码是什么。FlyEnv 的 MySQL 服务默认用户通常是root密码默认为空。你可以在 FlyEnv 的配置面板里找到 MySQL 的 bin 目录路径然后通过命令行连接。我个人的习惯是直接用图形化数据库工具连接比如 Sequel Ace 或 Navicat。连接参数如下主机127.0.0.1 端口3306 用户名root 密码空连接上之后就可以为项目创建数据库了。比如我的图书管理系统执行一条创建语句CREATE DATABASE IF NOT EXISTS bookms DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;然后把项目的 SQL 文件导入进来。如果是 Laravel 项目你还可以直接在.env文件里配置数据库连接然后执行php artisan migrate来自动建表。FlyEnv 默认的 MySQL 编码和时区都设置得比较合理日常开发基本不用额外配置。有个细节我提醒一下FlyEnv 的 MySQL 版本可能和你线上服务器不一致如果你在本机导入工作正常上线前最好确认一下线上环境的版本和sql_mode设置否则可能出现本地可以跑、线上报错的情况。3.3 Redis 和队列服务的快捷配合Redis 在 PHP 项目里通常用来做缓存、队列或 Session 存储。FlyEnv 内置了 Redis你只需要打开开关然后确认端口是 6379 就行。我用 Redis 的方式一般是在 Laravel 项目里把CACHE_DRIVER和QUEUE_CONNECTION改成redis然后在.env里指定REDIS_HOST127.0.0.1 REDIS_PASSWORDnull REDIS_PORT6379保存之后执行php artisan config:clear清一下配置缓存再访问页面你会发现响应速度快了不少。如果想确认 Redis 里是不是真的有数据可以直接在终端里执行redis-cli ping如果返回PONG说明连接正常。FlyEnv 的 Redis 配置也支持密码不过本地开发环境我一般留空省得每个项目的.env都要改密码。3.4 绑定域名和 HTTPS 证书是怎么自动实现的你可能想知道为什么我绑定bookms.test就能直接在浏览器里访问还自带 HTTPS。这里 FlyEnv 做了两件很贴心的事情。第一件是自动改写系统 hosts 文件。FlyEnv 会在你创建站点时把绑定域名写入/etc/hosts让.test域名解析到本机。以前我们手动编辑 hosts 文件要输入管理员密码还要特别小心别改错格式现在这些操作都透明化了。第二件是自动签发本地 SSL 证书。FlyEnv 内部集成了 mkcert 类似的工具它会生成一个本机信任的 CA 证书然后为每个站点生成对应的 https 证书。首次使用时系统可能会提示你允许安装这个本地 CA 证书点允许即可。装好之后你的浏览器不会再对https://bookms.test报不安全警告。有一点需要留意如果你同时用其他工具比如 Laravel Valet 或别名可能也会干扰 hosts 文件的跳转但 FlyEnv 多数情况下能处理得很好。4. 常见问题与排查技巧实录4.1 端口冲突Nginx 或 MySQL 启动失败这是我用 FlyEnv 过程中遇到最多的一个问题尤其是以前装过 MySQL 或 Apache 的机器。症状是点击服务开关后开关勉强变绿一秒然后又跳回红色或者直接提示端口被占用。排查思路是先找到占用端口的进程。比如你想查 3306 端口执行lsof -i :3306如果输出里有进程列表那就说明确实有别的 MySQL 在跑。一个处理办法是停掉系统自带的或者旧版的 MySQL 服务另一个办法是改 FlyEnv 的 MySQL 端口。打开 FlyEnv 的 MySQL 配置把端口改成3307然后把项目的数据库连接端口也同步改掉。Nginx 同理如果你本机的 80 端口被别的服务占用可以在配置里改成8080访问站点时用http://bookms.test:8080。注意尽量不要用kill -9硬杀 MySQL 或 Nginx 进程这样可能导致数据文件损坏建议用brew services stop或服务自带的管理命令来停止。4.2 切了 PHP 版本但终端不生效还有一种情况比较诡异FlyEnv 界面里已经切到 PHP 8.2但你在终端执行php -v看到的还是 7.4 或者系统自带的版本。这通常是因为终端的PATH里系统 PHP 目录排在 FlyEnv 的目录前面。你可以执行这条命令查看当前 PHP 执行文件的路径which php如果输出的路径不是 FlyEnv 的路径那就要看你的~/.zshrc或~/.bash_profile里有没有写过关于 PHP 的别名或 PATH 配置。如果之前手动安装过 PHP大概率是有残留的删掉对应行再重新打开终端即可。我个人建议在.zshrc里把 FlyEnv 的 PHP 目录放在最前面这样每次终端都会优先使用 FlyEnv 管理的 PHP。4.3 浏览器访问站点出现“无法连接”或 502 Bad Gateway502 这个错误在 PHP 开发里很熟悉它代表 Nginx 已经收到请求但是后端的 PHP-FPM 没有正确响应。出现这个情况的时候你先确认目标站点的 PHP 服务有没有在 FlyEnv 里启动。如果我同时开了两个站点一个用 PHP 8.2一个用 PHP 7.4但只启动了其中一个版本另一个站点的请求就会 502。解决办法很简单在 FlyEnv 服务列表里把对应版本 PHP 的开关打开让 PHP-FPM 运行起来。还有一种可能是项目的public目录权限不对Nginx 没有读取权限可以把项目目录的所有权调整到当前用户sudo chown -R $(whoami):staff /Users/mac/Sites/bookms如果你用的是 Laravel还要确保storage和bootstrap/cache目录可写。4.4 数据库连不上连接被拒绝或 Access denied这个问题的典型表现是项目页面能打开但一查数据库就报SQLSTATE[HY000] [2002] Connection refused或者Access denied for user。先看端口和连接信息是不是对的特别是密码。FlyEnv 默认 MySQL 的 root 密码为空如果你之前用别的工具装过 MySQL可能会残留密码。这时候可以在 FlyEnv 配置里重置 MySQL 的 root 密码或者在数据库工具里为项目单独创建一个用户再授权给它比如CREATE USER bookmslocalhost IDENTIFIED BY secret; GRANT ALL PRIVILEGES ON bookms.* TO bookmslocalhost; FLUSH PRIVILEGES;这样能避免在项目里用 root 账号权限更清晰也方便以后迁移。如果你用了 Redis 而连不上检查一下项目里.env的REDIS_HOST是否改成了127.0.0.1不要用localhost因为某些 PHP 版本和系统环境里localhost会被解析成 IPv6 的::1而 Redis 默认只监听 IPv4就会出现连不上的情况。4.5 FlyEnv 占用空间大要不要清理用了一段时间 FlyEnv 之后你可能会注意到它的目录体积越来越大。这是因为它内部的多个 PHP 版本、扩展包、日志文件都在增长。我有一次发现~/Library/Application Support/FlyEnv占了 8GB里面一半是日志和缓存。可以打开 FlyEnv 的清理工具把不用的 PHP 版本、站点日志和下载缓存清掉。只要你不手滑删掉正在用的版本基本不会有问题。还有一种情况是站点日志增长特别快尤其是调试模式开着的时候。你可以直接在 Nginx 配置里把 access_log 关掉只保留 error_log这样能明显减少日志体积。FlyEnv 的相关配置入口都在界面里操作起来比直接改配置文件直观得多。5. 写给你的最后建议5.1 一套好环境能给你省下的时间比你想象的要多我在文章开头说了本地环境折腾起来一个下午说没就没。但更重要的是这种折腾会打断你的创作流。你原本想的是“加个功能、修个 bug”结果一抬头已经在查“为什么 brew install 报错”了。凭我这两三个月的使用感受FlyEnv 确实把这类杂事压到了最低让我能一直把手放在项目代码上而不是系统配置上。它适合的人群非常明确以 PHP 为主要语言、想快速起项目、又不想在环境维护上花太多时间的 Mac 用户。不管你是刚入行的新手还是带过很多项目的资深开发它都能给你一个相对稳定和干净的底座。你不用再去记忆“先装 PHP再装 Nginx再改 php-fpm.conf”的安装顺序也不用担心升级某个包后把整个项目环境搅成一锅粥。5.2 再补充一点我对本地环境的心得无论用 FlyEnv 还是别的工具我都建议你在项目里维护一个.env.example文件把数据库、Redis、队列等连接相关配置的说明写在注释里。这样换电脑、换同事接手、或者将来部署到服务器都不会因为本地环境信息不一致而出乱子。另外定期备份数据库也是个好习惯FlyEnv 的 MySQL 数据默认存放在它的数据目录万一系统升级或软件重装先把数据目录拷贝一份总没错。自从把本地环境切到 FlyEnv 之后我的开发效率确实提升了一个台阶。如果你也正被 Mac 上乱七八糟的环境问题困扰不妨下载它试试看照着我上面的流程从头走一遍就能感受到它带来的便利。环境这种东西本身不产生业务价值但一个不会拖后腿的环境能保证你所有的时间都花在真正重要的事情上。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →