我正在构建一个 Web 应用程序,除其他外,它还需要连接到 FTP 服务器以下载或上传文件。该应用程序是用 PHP 编写的,它托管在 Linux 服务器上。
我想知道是否也可以提供对 SFTP 服务器的支持,但是在 Google 上进行了一些快速搜索之后,似乎这并不是那么简单。
所以,问题是:在 PHP 中使用 SFTP 的最佳方式是什么?是否有一个类也可以为 FTP 和 SFTP 提供支持,以便两者都可以使用相同的功能?
是的,你可以用cURL做到这一点。要从 FTP 切换到 SFTP,您只需将协议选项形式更改CURLPROTO_FTP
为CURLPROTO_SFTP
.
cURL 支持以下协议:HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TELNET、LDAP、LDAPS、DICT、FILE、TFTP。
顺便提一句。不要将 SFTP 与 FTPS 混淆。SFTP 是 SSH 文件传输协议,而 FTPS 是 FTP over SSL。
如果您没有安装 cURL(我的主机没有),您可以使用 phpseclib:
http://phpseclib.sourceforge.net/documentation/net.html#net_sftp
以防有人最终出现在此页面上。
您也可以将PHP Bindings for LIBSSH2与 PHP 一起使用。它应该适当地安装在系统上。
在 Ubuntu 10.04 和 Debian Lenny 中,当然还有所有依赖项
apt-get install libssh2-php
Igor 建议的问题在于,除其他外,它使得可移植代码少得多(libssh2 没有安装在很多主机上),它具有更直观的基于 OOP 的 API 并且 RSA 身份验证实际上是有意义的(libssh2 需要您将公钥和私钥分别存储在文件系统上;必须单独提供它们的事实是愚蠢的,因为大多数私钥格式都包含公钥)。
phpseclib 也更快:
http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/#comment_3759
$dataFile = 'PASTE_FILE_NAME_HERE';
$sftpServer = 'PASTE_SFTP_SERVER_NAME_HERE';
$sftpUsername = 'PASTE_USERNAME_HERE';
$sftpPassword = 'PASTE_PASSWORD_HERE';
$sftpPort = 'PASTE_PORT_HERE';
$sftpRemoteDir = '/';
$ch = curl_init('sftp://' . $sftpServer . ':' . $sftpPort . $sftpRemoteDir . '/' . basename($dataFile));
$fh = fopen($dataFile, 'r');
if ($fh) {
curl_setopt($ch, CURLOPT_USERPWD, $sftpUsername . ':' . $sftpPassword);
curl_setopt($ch, CURLOPT_UPLOAD, true);
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch, CURLOPT_INFILE, $fh);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($dataFile));
curl_setopt($ch, CURLOPT_VERBOSE, true);
$verbose = fopen('php://temp', 'w+');
curl_setopt($ch, CURLOPT_STDERR, $verbose);
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if ($response) {
echo "Success";
} else {
echo "Failure";
rewind($verbose);
$verboseLog = stream_get_contents($verbose);
echo "Verbose information:\n" . $verboseLog . "\n";
}
}