核心是替换明文FTP为基于SSH加密的传输通道,必须启用官方ssh2扩展(Ubuntu用sudo apt install php-ssh2,CentOS用yum install php-pecl-ssh2,Windows需配置php_ssh2.dll),通过ssh2_connect、ssh2_auth_password和ssh2_sftp建立可信连接,再以fopen("ssh2.sftp://...")流方式安全上传文件,并注意权限、编码、超时及上传后校验。

用SFTP安全传输PHP网站文件,核心是替换明文FTP为基于SSH加密的传输通道。关键不在“怎么传”,而在“怎么建可信连接+怎么保文件完整”。
确认服务器和PHP环境支持SFTP
PHP本身不内置SFTP函数,必须依赖ssh2扩展(官方PECL扩展,非第三方库)。操作前先验证:
- 运行
php -m | grep ssh2,有输出说明已启用 - 若无输出:Ubuntu/Debian执行
sudo apt install php-ssh2 && sudo systemctl restart apache2;CentOS/RHEL用yum install php-pecl-ssh2 - Windows用户需下载对应PHP版本的
php_ssh2.dll,放入ext目录并在php.ini中添加extension=php_ssh2.dll - 确保远程服务器已开启SSH服务(端口默认22),且目标用户有对应目录写权限
用ssh2扩展上传整个PHP网站
以下代码可直接替代原FTP上传逻辑,支持二进制安全、路径自动处理、错误捕获:
- 建立连接:
$conn = ssh2_connect('your-server.com', 22); - 密码认证:
ssh2_auth_password($conn, 'username', 'password'); - 初始化SFTP子系统:
$sftp = ssh2_sftp($conn); - 上传单个文件:
$stream = fopen("ssh2.sftp://{$sftp}/var/www/html/index.php", 'w'); fwrite($stream, file_get_contents('./local/index.php')); fclose($stream); - 批量上传建议封装循环:遍历本地项目目录,对每个文件调用相同流程,注意远程路径需用
sprintf("ssh2.sftp://{$sftp}%s", $remote_path)拼接
避免常见陷阱
很多上传失败或文件为空,其实卡在细节:
立即学习“PHP免费学习笔记(深入)”;
-
路径权限问题:远程目录需对登录用户有写权限(如
chown username:www-data /var/www/html && chmod 755 /var/www/html) -
空文件问题:用
fopen + fwrite后必须fclose,否则缓冲未刷入;更稳妥可用ssh2_scp_send()直接发送本地文件 -
中文路径或特殊字符:远程路径统一用UTF-8编码,避免空格,必要时用
rawurlencode()处理文件名 -
大文件超时:连接前加
ssh2_connect($host, $port, ['timeout' => 30]),并确保set_time_limit(0)防脚本中断
上传后必做的三件事
传完不等于上线成功:
- 检查远程文件权限:PHP文件设为644,目录设为755,
index.php等入口必须可读可执行 - 确认Web服务器根目录指向正确路径(如Nginx的
root /var/www/html) - 测试访问域名,查看PHP错误日志(
/var/log/apache2/error.log或/var/log/nginx/error.log)排查解析问题



















