适用于PHP的sftp

时间:2018-05-24 12:55:12

标签: php sftp

我需要使用PHP7实现从sftp服务器下载的文件。 我明白了,我有http://php.net/manual/ru/function.ssh2-sftp.php个功能。 其中我有ssh2_scp_recvssh2_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)

2 个答案:

答案 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。并不是说你的读操作会起作用 - 上面的代码永远不会打开文件句柄。

相关问题