最稳方式是安装Remote-WSL插件后在WSL终端执行code .,使VS Code以Linux权限模型运行;避免用Windows编辑器直连wsl$路径,防止乱码、权限错和保存失败。

WSL里怎么打开并编辑PHP文件?
直接用 VS Code 打开 WSL 中的 PHP 文件最稳,别用 Windows 本地编辑器硬连 WSL 路径——容易乱码、权限错、保存失败。
关键不是“能不能打开”,而是“打开后能不能正确读写、运行、调试”。WSL 的文件系统(尤其是 /home/ 下)和 Windows 的 NTFS 是两套权限逻辑,跨层编辑极易出问题。
- VS Code 安装 Remote - WSL 插件后,在 WSL 终端里执行
code .,它会自动启用 WSL 后端,所有文件操作走 Linux 权限模型 - 别用 Notepad++ 或 Sublime Text 直接打开
\wsl$Ubuntuhomeuserprojectindex.php这种路径——Windows 应用对 WSL2 的 9P 文件系统支持不完整,fopen()可能返回Permission denied - 如果必须用其他编辑器,把 PHP 文件放在
/mnt/c/Users/xxx/下(即 Windows 的 C:Users),但注意:PHP CLI 运行时要手动用wslpath转换路径,否则include会报No such file or directory
PHP 文件在 WSL 里改完为啥不生效?
常见原因是 PHP 进程没重启,或者 Web 服务器(如 Apache/Nginx)没重载配置,又或者 OPcache 没清掉——不是编辑器的问题,是运行环境缓存链没断干净。
- 用
php -S起的内置服务器:每次改完代码,Ctrl+C 停掉再重新跑php -S localhost:8000 - 用 Apache:改完 PHP 文件后,执行
sudo systemctl reload apache2(不是 restart,reload 更快且不中断连接) - 启用 OPcache 时(默认开启),改完得清缓存:
sudo php -r "opcache_reset();",或临时关掉opcache.enable=0在/etc/php/*/cli/php.ini和/etc/php/*/apache2/php.ini里 - 检查 PHP 版本是否一致:
which php和php -v看 CLI 用的是哪个;Web 服务用的可能是另一个版本(比如php8.1CLI +php8.2Apache 模块),改错位置当然不生效
怎么从 Windows 浏览器访问 WSL 里的 PHP 页面?
WSL2 默认用虚拟网卡,IP 动态变,不能直接用 localhost 访问 Apache/Nginx —— 得靠 Windows 主机的端口转发,或改用 127.0.0.1 绑定。
立即学习“PHP免费学习笔记(深入)”;
- Apache/Nginx 配置里把
Listen和ServerName设成127.0.0.1:80,而不是*:80或0.0.0.0:80,避免绑定到 WSL2 内网 IP - 确保 Windows 防火墙放行对应端口(如 80、8000),命令行执行:
netsh interface portproxy add v4tov4 listenport=80 connectport=80 connectaddress=127.0.0.1 protocol=tcp - 浏览器直接访问
http://localhost即可;不要试http://172.x.x.x(WSL2 内网 IP),Windows 主机默认路由不到那个网段 - 如果用
php -S,启动时指定-S 0.0.0.0:8000,然后 Windows 浏览器访问http://localhost:8000就行——这是最轻量、最不容易出错的方式
为什么 file_put_contents() 在 WSL 里写文件失败?
不是函数问题,是路径权限或挂载选项导致的。尤其当你把项目放在 /mnt/c/ 下时,NTFS 分区默认以 noacl 挂载,Linux 的 chmod/chown 不生效,file_put_contents() 会静默失败或报 failed to open stream: Permission denied。
- 确认文件所在目录归属:运行
ls -l /path/to/file.php,看 owner/group 是否为当前用户;若显示root root或奇怪 UID,说明路径来自 Windows 挂载点,权限不可控 - 优先把 PHP 项目放在 WSL 原生路径下,比如
/home/user/project,这里chmod 644和chown user:user完全有效 - 如果非得用
/mnt/c,在/etc/wsl.conf加上:[automount]<br>options = "metadata,umask=22,fmask=11"
,然后重启 WSL(wsl --shutdown),才能让 chmod 生效 - 写日志类操作建议用绝对路径 + 显式错误检查:
if (false === file_put_contents('/tmp/log.txt', 'data', FILE_APPEND)) { error_log('write failed: ' . error_get_last()['message']); }
WSL 编辑 PHP 最容易被忽略的点:你以为在改文件,其实是在改两个不同权限体系下的“同名副本”——Windows 应用写的是 NTFS 层,PHP 进程读的是 Linux VFS 层,中间差一层 metadata 映射。真要省事,就别跨边界。



















