不能只配SFTP上传就以为能“运行代码”——远程执行依赖PHP解释器配置,不是传完文件就能直接F5调试;上传成功但浏览器404或空白页主因是Web服务器root与PhpStorm的Web path映射不一致,且需确保Opcache刷新、文件权限正确、SELinux未拦截;真正运行需配置Remote Interpreter并严格同步路径映射。

不能只配SFTP上传就以为能“运行代码”——远程执行依赖PHP解释器配置,不是传完文件就能直接F5调试。
为什么上传成功但浏览器访问404或空白页
根本不是连接问题,而是路径映射和Web服务器根目录不一致。比如你在PhpStorm里设的Root path是/var/www/html/myapp,但Nginx实际root指向的是/var/www/html,且location /没做重写,那访问http://example.com/就永远找不到index.php。
- 检查Nginx/Apache配置中
root或DocumentRoot值,必须与PhpStorm的Web path for this project(在Mappings里)完全对应 -
Web path for this project填的是URL路径,不是文件系统路径:填/myapp/,不代表要上传到/myapp/子目录,而是告诉IDE“我通过https://example.com/myapp/访问这个项目” - 如果用宝塔、AMH等面板,确认网站根目录权限属主是SSH登录用户(如
www-data或www),否则上传后PHP进程读不到文件
自动上传后PHP没生效:Opcache和文件权限是真凶
上传成功、时间戳更新、ls -l看文件属主也对,但浏览器还是旧内容——90%是Opcache没刷新,或SELinux/AppArmor拦截了PHP读取。
- 远程服务器执行
php -r "opcache_reset();",或加一行ini_set('opcache.enable', 0);临时关闭(仅开发环境) - 检查
phpinfo()里Loaded Configuration File路径,确认opcache.revalidate_freq不是设成60秒以上 - 如果远程是CentOS/RHEL,跑
getenforce;返回Enforcing就需临时关SELinux:setenforce 0(重启失效,仅验证用) - 上传后手动
chown -R www-data:www-data /var/www/html/myapp(按实际Web用户调整)
怎么让PhpStorm真正“运行”远程PHP脚本(不只是上传)
上传 ≠ 执行。要F5调试或Ctrl+Shift+F10运行,必须配Remote Interpreter,不是Deployment里的SFTP连接。
立即学习“PHP免费学习笔记(深入)”;
- 进
Settings > Languages & Frameworks > PHP,点CLI Interpreter右侧... - 点
+→From Docker, Vagrant, SSH Config...→ 选SSH Configuration - 从下拉菜单选你已配好的Deployment服务器(不是重新输一遍账号!)
- PhpStorm会自动探测
php路径,若失败就手动填/usr/bin/php或which php结果 - 关键一步:勾选
Use path mappings,并确保Local path和Remote path与Deployment的Mappings一致(例如本地/home/user/project→ 远程/var/www/html/myapp)
私钥登录失败、Connection refused、Testing connection…卡住
不是密码错,是SFTP子系统没开或路径映射错位。终端能ssh登录 ≠ 能sftp上传。
- 先在本地终端执行:
sftp -P 22 user@host,进去了再pwd看当前路径——这就是PhpStorm里Root path该填的值 - 如果报
subsystem request failed on channel 0,说明SSH服务没启用sftp-server,需改/etc/ssh/sshd_config,确认有Subsystem sftp /usr/lib/openssh/sftp-server或internal-sftp - 私钥必须是OpenSSH格式,PuTTY的
.ppk直接丢进去必失败;用PuTTYgen导出时选Export OpenSSH key,且passphrase留空 -
Root path不能以~开头,不能是相对路径,也不能带用户名前缀(如user@host:/path)
最常被忽略的点:Deployment配置只是同步通道,Remote Interpreter才是执行引擎。两者路径映射必须严格一致,差一个字符都会导致断点不命中、require失败、autoload找不到类。


















