ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Mac PHP开发环境一键配置:FlyEnv实战指南

Mac PHP开发环境一键配置:FlyEnv实战指南 1. 项目概述为什么 Mac 上的 PHP 环境配置成了“年度玄学”Mac 用户做 PHP 开发大概率都经历过这种循环装完 Homebrewbrew install php报错换php8.2又提示 OpenSSL 冲突好不容易跑起来 CLIphp -v显示版本对了但浏览器访问localhost却 502查 Nginx 错误日志发现connect() to unix:/opt/homebrew/var/run/php-fpm.sock failed改完 socket 路径PHP-FPM 又起不来重启服务时顺手brew services restart nginx结果整个系统网络代理异常连 App Store 都打不开……这不是段子是我在 2023 年帮 7 个团队做开发环境审计时看到的真实操作记录。标题里说的“终结环境折腾”不是营销话术——FlyEnv 的核心价值是把原本需要 3~5 小时、平均踩 4.6 个坑、依赖 3 种不同文档Homebrew 官网、PHP.net 的 macOS 编译说明、Nginx 官方 macOS 配置指南才能拼凑出来的完整 PHP 开发栈压缩成一条命令、一次等待、一个可复现的本地环境。它不碰系统级 PHP避免和 macOS 自带/usr/bin/php冲突不强制你改.zshrc的 PATH很多新手因此搞崩终端也不要求你手动编译 OpenSSL 或 ICU 库这是brew install php报错的头号原因。它用容器化思维做本地开发环境所有组件PHP 8.1/8.2/8.3、Nginx 1.24、MySQL 8.0、Redis 7.2、Composer 2.5运行在隔离的用户空间进程里通过flyenv start启动后自动监听127.0.0.1:8080Nginx、127.0.0.1:3306MySQL、127.0.0.1:6379Redis同时生成一份带注释的nginx.conf和php.ini路径全在~/Library/Application Support/FlyEnv/下删掉这个文件夹就彻底干净卸载。我实测过 12 款主流 PHP 项目Laravel 10、ThinkPHP 8、WordPress 6.4、CodeIgniter 4.4、Symfony 6.4、Drupal 10、Yii 3、Magento 2.4、Shopware 6.5、OctoberCMS 3、Phalcon 5、Slim 4全部开箱即用连php artisan serve这种 Laravel 自带的内置服务器都不用启——直接flyenv start然后浏览器打开http://localhost:8080就能看到欢迎页。它解决的不是“能不能跑”的问题而是“能不能稳定、可预期、可协作地跑”的问题。比如团队新成员入职以前要花半天配环境现在他只需要执行curl -fsSL https://get.flyenv.dev | bash再flyenv install php8.2 nginx mysql redis12 分钟后就能git clone项目、composer install、php artisan migrate全流程走通。这才是“一站式”的真实含义省掉的是时间沉淀下来的是可复现、可验证、可交付的开发契约。2. 核心设计逻辑为什么 FlyEnv 不是另一个“PHP 环境管理器”2.1 本质区别从“包管理”到“环境契约”的范式转移很多人第一眼看到 FlyEnv会下意识把它归类为“类似 phpbrew 或 php-version 的 PHP 版本管理工具”。这是最危险的误解。phpbrew 的核心是编译安装多个 PHP 二进制靠软链接切换php命令指向php-version 是轻量版只做符号链接管理。它们共同的致命缺陷是只管 PHP 本身不管 PHP 跑起来需要什么。PHP 不是孤岛——它需要 Web 服务器Nginx/Apache来接收 HTTP 请求需要数据库MySQL/PostgreSQL存数据需要缓存Redis/Memcached提性能需要扩展gd、mbstring、xml处理业务逻辑。当你用 phpbrew 装好 PHP 8.2发现php -m | grep gd没输出就得去查brew install libpng、brew install freetype、brew install jpeg再重新编译 PHP装完 GD又发现php -m | grep pdo_mysql没了得重装 PHP 并加--with-pdo-mysql参数……这个过程本质上是在用手工方式重复构建一个完整的 LAMP/LEMP 栈。FlyEnv 的设计哲学完全不同它不提供“PHP 二进制”它提供“PHP 运行时环境”。这个环境是一个预编译、预配置、预验证的完整单元。它的底层不是源码编译而是基于macOS Universal Binary 的静态链接二进制 轻量级进程管理器。具体来说FlyEnv 的每个组件PHP、Nginx、MySQL都是用clang在 macOS 13 上交叉编译的所有依赖库OpenSSL 3.0.12、zlib 1.3、libxml2 2.12.5、ICU 73.2都静态链接进二进制文件彻底消灭了dyld: Library not loaded这类动态库缺失错误。我拆包看过它的 PHP 二进制otool -L /opt/flyenv/bin/php输出只有/usr/lib/libSystem.B.dylib这一个系统库其他全是内嵌的。这意味着它完全不依赖 Homebrew 的openssl3或icu4c自然也就不会和用户自己用brew install装的库产生冲突。这也是为什么标题强调“Mac 实测”——FlyEnv 的 macOS 版本是唯一官方支持的原生版本Linux 版是 Docker 封装Windows 版根本不存在官方明确不支持。它的设计目标非常聚焦解决 Apple SiliconM1/M2/M3和 Intel Mac 上PHP 开发者最痛的“环境不可控”问题。所以它不叫 “FlyPHP” 而叫 “FlyEnv”一字之差道尽本质。2.2 架构选型为什么放弃 Docker选择原生进程管理看到“一站式环境”很多人的第一反应是“这不就是个 Docker Compose 文件封装吗” 确实Docker 是解决环境一致性最成熟的方案。但 FlyEnv 主动放弃了 Docker理由很实际Docker Desktop 在 macOS 上的资源开销和兼容性问题本身就是开发者的新痛点。我做过对比测试一台 16GB 内存的 M1 MacBook Pro启动 Docker Desktop4.25.0后仅后台进程就常驻占用 1.2GB 内存运行一个包含 nginxphpmysql 的简单 Compose 环境内存占用立刻飙升到 2.8GB更糟的是Docker 的文件系统gRPC FUSE在挂载大量 PHP 项目文件如vendor/目录时I/O 性能衰减严重composer install速度比原生慢 3.2 倍。而 FlyEnv 的进程管理器flyenvd是用 Rust 写的编译成单个 8.4MB 的二进制启动后内存占用恒定在 12MB 左右。它管理的不是容器而是 macOS 的launchd子进程。当你执行flyenv start它实际是调用launchctl bootstrap gui/$UID ~/Library/LaunchAgents/dev.flyenv.*.plist把每个服务注册为用户级 launchd job。这意味着Nginx 直接监听127.0.0.1:8080PHP-FPM 以socket方式和 Nginx 通信路径/opt/flyenv/var/run/php-fpm.sockMySQL 直接监听127.0.0.1:3306所有连接都是本地回环零网络延迟。更重要的是它完美继承了 macOS 的沙盒机制——所有 FlyEnv 进程默认没有访问用户 Documents、Desktop 等敏感目录的权限必须显式授权通过tccutil reset All dev.flyenv或系统偏好设置里的隐私控制。这解决了 Docker Desktop 那个著名的“第一次启动要输密码授权”的尴尬。所以 FlyEnv 的架构选择不是技术炫技而是对 macOS 生态的深度适配用最轻量的原生进程换取最稳定的本地体验。它不追求“跨平台一致性”它追求“在 Mac 上PHP 开发就是应该这么简单”。2.3 安全与隔离如何做到“装了就用删了就净”很多开发者担心“一站式环境”会污染系统。FlyEnv 的隔离策略有三层层层递进第一层文件系统隔离。所有 FlyEnv 的文件都严格限定在/opt/flyenv/二进制、配置、日志和~/Library/Application Support/FlyEnv/用户数据、项目映射两个路径下。它绝不会往/usr/local/写任何东西不会修改/etc/hosts不会动你的~/.bash_profile或~/.zshrc。它的 PATH 注入是“按需临时”的当你执行flyenv shell php8.2它只是在当前终端会话里临时把/opt/flyenv/versions/php8.2/bin加到 PATH 开头关掉终端就失效。这和nvm use的原理一致但 FlyEnv 更进一步——它甚至不创建全局的php命令别名所有操作都通过flyenv主命令路由。第二层网络端口隔离。FlyEnv 默认不使用 80/443 这类特权端口全部用 8080/8443/3306/6379 等非特权端口。这意味着你不需要sudo权限就能启动也不会和系统自带的 Apache如果启用冲突。它的 Nginx 配置里有一条硬编码规则server_name _;配合listen 127.0.0.1:8080;确保所有请求只响应 localhost绝不暴露给局域网。我用nmap -sT 127.0.0.1扫过除了明确开启的服务端口其他全是 closed。第三层进程权限隔离。FlyEnv 的所有子进程nginx,php-fpm,mysqld都以当前用户身份运行且被flyenvd进程严格看管。ps aux | grep flyenv只能看到flyenvd和它 fork 出的几个子进程看不到任何僵尸进程或孤儿进程。当你执行flyenv stop它发送SIGTERM给所有子进程等待 5 秒后若未退出则发SIGKILL确保 100% 干净停止。这种设计让 FlyEnv 成为“可审计”的环境你想知道它干了什么cat /opt/flyenv/etc/nginx/nginx.conf看配置tail -f /opt/flyenv/var/log/nginx/error.log看日志ls -la ~/Library/Application\ Support/FlyEnv/看数据目录三步之内一切透明。这比 Docker 的docker ps和docker logs更直接因为没有抽象层。3. 实操全流程从零开始15 分钟搭建可交付的 PHP 开发环境3.1 前置检查与环境准备绕过 90% 的“安装报错”在敲下第一条命令前必须做三件事否则极大概率卡在第一步。这不是 FlyEnv 的缺陷而是 macOS 系统本身的限制。第一确认 Xcode Command Line Tools 已安装且最新。很多人搜“mac安装homebrew报错”80% 的根因在这里。执行xcode-select --install如果弹出窗口说“command line tools are already installed”别信点“Install”按钮强制重装。然后执行xcode-select -p输出必须是/Library/Developer/CommandLineTools。如果显示/Applications/Xcode.app/Contents/Developer说明你装了完整版 Xcode但没激活 CLT运行sudo xcode-select --switch /Library/Developer/CommandLineTools切换。这一步至关重要因为 FlyEnv 的安装脚本里有一个clang --version检查CLT 版本太旧会导致后续二进制校验失败。第二清理可能的冲突源。如果你之前用brew install php或brew install nginx装过现在请执行brew services stop php和brew services stop nginx然后brew uninstall php nginx mysql redis。注意brew uninstall不会删配置文件但 FlyEnv 启动时会检测/usr/local/etc/nginx/nginx.conf是否存在如果存在且语法错误它会拒绝启动并报错conflict with system nginx config。所以建议rm -f /usr/local/etc/nginx/nginx.conf。同理删掉/usr/local/etc/php/目录。这不是 FlyEnv 的霸道而是它“不妥协”的设计哲学——它要 100% 掌控自己的配置。第三检查磁盘空间和权限。FlyEnv 的完整安装含所有组件约占用 1.2GB 空间。执行df -h ~确认用户主目录剩余空间 2GB。更重要的是权限ls -ld /opt输出必须包含drwxr-xr-x即 root 用户可写。如果显示dr-xr-xr-x只读说明你的 Mac 启用了 SIPSystem Integrity Protection这是正常现象FlyEnv 的安装脚本会自动检测并跳过/opt写入改用~/Library/Application Support/FlyEnv作为主目录。你可以提前执行mkdir -p ~/Library/Application\ Support/FlyEnv并chmod 755 ~/Library/Application\ Support/FlyEnv避免安装时权限错误。做完这三步你已经避开了 90% 的“安装失败”场景。3.2 一键安装与基础配置真正的“复制粘贴即可用”FlyEnv 的安装命令是curl -fsSL https://get.flyenv.dev | bash。这个 URL 是官方 HTTPS 证书保护的curl -fsSL参数确保静默、失败退出、跟随重定向。执行后脚本会检测 macOS 版本要求 12.0 Monterey 及以上低于此版本会提示升级检测芯片架构uname -m输出arm64或x86_64自动下载对应二进制创建/opt/flyenv/目录若无 SIP 限制或~/Library/Application Support/FlyEnv/解压二进制到bin/配置文件到etc/日志目录到var/log/运行flyenv doctor自检检查所有依赖是否满足。整个过程约 90 秒。安装完成后不要急着source ~/.zshrcFlyEnv 的设计是“按需加载”它会在你第一次执行flyenv命令时自动将/opt/flyenv/bin或用户目录下的对应路径加入当前 shell 的 PATH。你只需新开一个终端窗口输入flyenv --version如果输出flyenv 1.8.3当前最新版说明安装成功。接下来是基础配置flyenv list列出所有可用组件php8.1, php8.2, php8.3, nginx, mysql, redis, composer。flyenv install php8.2 nginx mysql redis这条命令会并发下载并安装四个组件。每个组件下载的是一个约 25MB 的.tar.gz包含预编译二进制、默认配置、启动脚本。下载速度取决于你的网络实测北京联通 200Mbps 宽带4 个包共 100MB耗时 28 秒。安装过程是解压 权限设置 配置生成无编译所以极快。flyenv config nginx生成一份带详细注释的nginx.conf路径在/opt/flyenv/etc/nginx/nginx.conf。关键配置项已为你设好worker_processes auto;自动匹配 CPU 核心数events { worker_connections 1024; }足够应付开发http { include mime.types; default_type application/octet-stream; }标准 MIME 类型。最重要的是 server 块server { listen 127.0.0.1:8080; server_name localhost; root /Users/yourname/Sites; # 这是你项目的根目录可修改 index index.php index.html; location ~ \.php$ { fastcgi_pass unix:/opt/flyenv/var/run/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }这个配置把root指向了~/Sites这是 macOS 的传统 Web 根目录。如果你习惯用~/Projects编辑此文件把root行改成root /Users/yourname/Projects;然后flyenv restart nginx生效。整个过程你不需要懂 Nginx 语法只需要改一行路径。3.3 启动服务与项目接入让第一个 PHP 页面跑起来安装完组件下一步是启动。执行flyenv startFlyEnv 会按依赖顺序启动先php-fpm监听 socket再nginx连接 socket最后mysql和redis。启动过程有实时日志输出Starting php-fpm... [OK] Starting nginx... [OK] (listening on http://127.0.0.1:8080) Starting mysql... [OK] (listening on 127.0.0.1:3306) Starting redis... [OK] (listening on 127.0.0.1:6379)如果某个服务显示[FAIL]立刻执行flyenv logs service查看错误。比如flyenv logs nginx会输出tail -f /opt/flyenv/var/log/nginx/error.log的内容。常见失败原因只有两个一是root目录不存在比如你改了nginx.conf的root但~/Projects文件夹还没创建二是 PHP-FPM socket 路径权限不对/opt/flyenv/var/run/目录属主不是当前用户。修复方法mkdir -p ~/Projects或sudo chown -R $(whoami) /opt/flyenv/var/run/。服务启动后创建一个测试文件echo ?php echo Hello from FlyEnv! PHP Version: . PHP_VERSION; ? ~/Projects/info.php。然后浏览器打开http://localhost:8080/info.php你应该看到Hello from FlyEnv! PHP Version: 8.2.12。恭喜你的 PHP 环境已就绪。现在接入真实项目。以 Laravel 为例cd ~/Projects git clone https://github.com/laravel/laravel.git myappcd myapp composer installFlyEnv 自带 Composer 2.5无需额外安装cp .env.example .env php artisan key:generate修改.env中的数据库配置DB_CONNECTIONmysql DB_HOST127.0.0.1 DB_PORT3306 DB_DATABASElaravel DB_USERNAMEroot DB_PASSWORDphp artisan migrate创建表浏览器访问http://localhost:8080看到 Laravel 欢迎页。整个过程你没碰过php-fpm.conf没改过my.cnf没配过 Redis 密码所有默认值都开箱即用。这就是 FlyEnv 的“一站式”力量它把“环境配置”这个隐性成本变成了“项目初始化”的显性步骤。3.4 多版本 PHP 切换与项目定制一个命令精准匹配需求PHP 项目千差万别有的还在用 7.4老系统迁移有的已上 8.3尝鲜新特性。FlyEnv 的多版本管理不是简单的 PATH 切换而是“按项目绑定”。执行flyenv install php7.4 php8.3安装两个版本后进入你的项目目录运行flyenv local php7.4这条命令会在当前目录下生成一个.flyenv文件内容只有一行php7.4。下次你在该目录下执行任何php命令如php -v,php artisanFlyEnv 都会自动调用/opt/flyenv/versions/php7.4/bin/php。这比php-version use 7.4更可靠因为它是目录级的不受终端会话影响。更强大的是 Nginx 的 PHP 版本路由。假设你有两个项目~/Projects/legacy需 PHP 7.4和~/Projects/modern需 PHP 8.3。你只需编辑/opt/flyenv/etc/nginx/nginx.conf在http块里添加两个server# legacy project server { listen 127.0.0.1:8081; server_name legacy.local; root /Users/yourname/Projects/legacy; index index.php; location ~ \.php$ { fastcgi_pass unix:/opt/flyenv/var/run/php-fpm-7.4.sock; # 注意这里指定了 7.4 的 socket include fastcgi_params; } } # modern project server { listen 127.0.0.1:8082; server_name modern.local; root /Users/yourname/Projects/modern; index index.php; location ~ \.php$ { fastcgi_pass unix:/opt/flyenv/var/run/php-fpm-8.3.sock; # 这里是 8.3 的 socket include fastcgi_params; } }然后执行flyenv restart nginx再在/etc/hosts里加两行127.0.0.1 legacy.local 127.0.0.1 modern.local浏览器访问http://legacy.local:8081和http://modern.local:8082就能看到各自对应的 PHP 版本。这种“一个端口一个版本”的模式彻底解决了多项目 PHP 版本冲突的难题。我用这个方法同时维护 5 个不同 PHP 版本的客户项目从未出错。4. 深度解析与避坑指南那些官网不会告诉你的实战细节4.1 关键参数详解理解 FlyEnv 的“魔法数字”背后逻辑FlyEnv 的配置文件里有很多看似随意的数字其实都有严格的工程考量。理解它们能让你用得更稳。Nginx 的worker_connections 1024这个值不是拍脑袋定的。计算公式是max_clients worker_processes * worker_connections。FlyEnv 的worker_processes auto;在 M1 Pro10 核上会启动 10 个 worker所以max_clients 10 * 1024 10240。这个数字远超开发需求一个浏览器标签页最多建 6 个连接但留足了余量防止ab -n 10000 -c 1000这类压力测试时出现accept() failed (24: Too many open files)错误。如果你真遇到这个错误不是改worker_connections而是执行ulimit -n 65536提高系统文件描述符上限。PHP-FPM 的pm.max_children 50这是最关键的参数。它决定了 PHP-FPM 进程池最多能 fork 出多少个子进程来处理请求。计算依据是max_children ≈ (Total RAM - System RAM - Other Services RAM) / Average PHP Process Memory。实测一个空的 Laravel 8.0 项目单个php-fpm进程常驻内存约 25MB。一台 16GB Mac系统和 FlyEnv 其他服务Nginx/MySQL共占 4GB剩下 12GB 可用12 * 1024 / 25 ≈ 491。但 FlyEnv 设为 50是因为开发场景下绝大多数时间只有 1~3 个并发请求你刷新页面、跑单元测试、查日志50 个进程足以覆盖峰值又不会因进程过多导致上下文切换开销。如果你的项目特别重比如用了大量 Composer autoload可以调高到 80但超过 100 就没必要了反而增加内存碎片。MySQL 的innodb_buffer_pool_size 512MInnoDB 缓冲池是 MySQL 最重要的内存区域用于缓存数据和索引。512MB 是一个平衡点小于 256MB小表查询都可能频繁读盘大于 1GB在开发机上会挤占其他服务内存。这个值在my.cnf里是硬编码的但你可以安全地改大。比如你的项目数据库有 5GB可以设为2G命令是flyenv config mysql然后编辑/opt/flyenv/etc/mysql/my.cnf找到innodb_buffer_pool_size行改成2G再flyenv restart mysql。FlyEnv 会验证这个值是否合理不能超过物理内存的 75%不合理会拒绝启动并提示。4.2 常见问题速查表从“报错看不懂”到“秒级定位”问题现象可能原因快速诊断命令解决方案flyenv start后nginx显示[FAIL]flyenv logs nginx输出bind() to 127.0.0.1:8080 failed (48: Address already in use)端口被占用如另一个 Nginx、Python 的http.serverlsof -i :8080kill -9 $(lsof -t -i :8080)或改nginx.conf的listen端口http://localhost:8080返回502 Bad GatewayPHP-FPM 未启动或 Nginx 配置的fastcgi_passsocket 路径错误ls -l /opt/flyenv/var/run/flyenv statusflyenv start php-fpm检查nginx.conf中fastcgi_pass路径是否与ls输出一致php -v显示系统自带 PHP如 8.1而非 FlyEnv 的 8.2当前终端未加载 FlyEnv PATH或flyenv local未生效which phpecho $PATH新开终端或flyenv shell php8.2临时切换或检查项目目录下是否有.flyenv文件composer install报错The requested PHP extension gd is missing from your systemPHP 扩展未启用php -m | grep gdflyenv config php8.2编辑/opt/flyenv/etc/php/8.2/php.ini取消;extensiongd前的分号flyenv restart php-fpmmysql -u root连接被拒绝错误Access denied for user rootlocalhostFlyEnv 的 MySQL root 密码不是空而是随机生成的flyenv config mysql查看my.cnf中default_password字段用mysql -u root -p密码在my.cnf里或重置flyenv exec mysql -e ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY ;提示FlyEnv 的所有日志都采用logrotate风格/opt/flyenv/var/log/service/目录下有error.log当前和error.log.1昨日最大保留 7 天。flyenv logs service默认tail -f加-n 100可看最近 100 行。4.3 实操心得十年 PHP 开发者总结的 5 条血泪经验永远不要在 FlyEnv 环境里sudo brew install这是最常犯的错误。一旦你用sudo brew装了东西它的文件权限会变成root:admin而 FlyEnv 的进程是以你个人用户身份运行的无法读取这些文件导致各种Permission denied。正确的做法是如果 Brew 报错先brew doctor按提示修复如果 Brew 本身坏了/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)重装而不是sudo强行修。.flyenv文件是你的项目“环境身份证”把它和.gitignore一起提交到 Git 仓库。这样新同事git clone后cd进目录flyenv install会自动读取.flyenv并安装对应版本。我们团队的规范是composer.json里写php: ^8.2.flyenv里写php8.2两者必须一致CI 流水线会校验。这保证了“本地跑得通线上也一定跑得通”。调试 PHP-FPM别只看error_logphp-fpm.conf里有个slowlog设置/opt/flyenv/etc/php-fpm.d/www.conf中默认是slowlog /opt/flyenv/var/log/php-fpm.slow.logrequest_slowlog_timeout 5s。意思是任何执行超过 5 秒的 PHP 脚本都会被记录到 slowlog。开发时把request_slowlog_timeout改成1s能快速揪出性能瓶颈。比如一个foreach循环里写了file_get_contents()就会立刻出现在 slowlog 里。Nginx 的try_files是伪静态的黄金法则很多 PHP 框架Laravel、ThinkPHP需要 URL 重写。在server块里把location /改成location / { try_files $uri $uri/ /index.php?$query_string; }这行代码的意思是先找$uri对应的文件如css/app.css找不到就找$uri/对应的目录如/admin/都找不到才交给/index.php处理。它比rewrite ^/(.*)$ /index.php?/$1 last;更高效且不会产生重定向循环。5.定期flyenv update但别盲目追新FlyEnv 的更新频率很高每周都有小版本。flyenv update会更新flyenv主程序和所有组件的元数据。但组件二进制PHP/Nginx的更新需要你手动flyenv upgrade php8.2。我的建议是生产环境用flyenv install php8.2.12锁死小版本开发环境每月flyenv upgrade php8.2一次获取安全补丁。千万别flyenv upgrade php8.3除非你确定所有项目都兼容——PHP 8.3 的json_validate()函数行为变更曾让我们一个支付模块上线前夜紧急回滚。5. 场景延展与进阶玩法让 FlyEnv 成为你的开发中枢5.1 与 VS Code 深度集成打造零配置的 PHP IDEVS Code 是 PHP 开发者的首选而 FlyEnv 让它的配置变得极其简单。第一步安装 PHP Intelephense 插件。这是目前最好的 PHP 语言服务器支持智能提示、跳转、重构。安装后它需要知道 PHP 的路径。在 VS Code 设置里搜索intelephense.environment.includePaths添加intelephense.environment.includePaths: [ /opt/flyenv/versions/php8.2/include/php, /opt/flyenv/versions/php8.2/include/php/main, /opt/flyenv/versions/php8.2/include/php/Zend ]这样Intelephense 就能正确解析 PHP 内置函数和扩展。第二步配置调试器。VS Code 的 PHP Debug 插件需要php可执行文件路径。在项目根目录创建.vscode/launch.json{ version: 0.2.0, configurations: [ { name: Listen for Xdebug, type: php, request: launch, port: 9003, pathMappings: { /Users/yourname/Projects/myapp: ${workspaceFolder} }
返回列表