我需要使用PHP7实现从sftp服务器下载的文件。
我明白了,我有http://php.net/manual/ru/function.ssh2-sftp.php个功能。
其中我有ssh2_scp_recv
和ssh2_scp_send
我看到这些函数接受完整的远程路径,就像scp那样。
我看到我可以使用以下代码:
$format = "ssh2.sftp://%d%s";
$remotePath = "/csv/$fileName";
$link = sprintf($format, intval($sftp), $remotePath);
$read = 0;
$filesize = filesize($link);
while (
($read < $filesize) &&
($buffer = fread($remote, $filesize - $read))
) {
$read += strlen($buffer);
if (fwrite($local, $buffer) === FALSE)
{
die("Failed to write to local file: $file\n");
}
}
但我收到错误:
PHP Warning: filesize(): stat failed for ssh2.sftp://36/csv/20180521_export_fraud_weborama_weborama_ru.ok
我认为这与以下事情有关。我没有大小:
print_r(ssh2_sftp_stat(ssh2_sftp($connection), $remotePath))
Array
(
[7] => 0
[size] => 0
[4] => 0
[uid] => 0
[5] => 0
[gid] => 0
[2] => 33188
[mode] => 33188
[8] => 1526868072
[atime] => 1526868072
[9] => 1526921030
[mtime] => 1526921030
)
我简直不敢相信,PHP的sftp没有正常实现。
同时我成功用shell sftp客户端获取文件。
更新
$sftp = ssh2_sftp($connection)
答案 0 :(得分:0)
每个思考都有效!它只是空文件。
$format = "ssh2.sftp://%d%s";
$remotePath = "/csv/$fileName";
$link = sprintf($format, intval($sftp), $remotePath);
if (!$remote = fopen($link, 'r'))
{
die("Failed to open remote file: $fileName");
}
答案 1 :(得分:-1)
ssh2.sftp://36/csv/20180521_export_fraud_weborama_weborama_ru.ok
这是not a valid URL:它意味着数据位于名为“36”的主机上,不允许作为DNS名称 - 但您似乎是故意这样做的 - intval($sftp)
。请参阅有关如何构建URL的链接。
也许你一直在努力提供帮助,并从你的例子中删除你认为多余的代码,但是你的代码似乎还有很多其他问题。
$ filesize = filesize($ link);
并非所有文件操作都在所有文件包装器中实现 - 尽管ssh_sftp2是一个例外(参见上一个链接)。但为什么轮询大小呢?刚看完EOF。并不是说你的读操作会起作用 - 上面的代码永远不会打开文件句柄。