PHP 足够的 sftp

Adequate sftp for PHP

我需要使用 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)

ssh2.sftp://36/csv/20180521_export_fraud_weborama_weborama_ru.ok

这是 not a valid URL:这意味着数据位于名为“36”的主机上,不允许将其用作 DNS 名称 - 但您似乎是故意这样做的 - intval($sftp) .有关如何构建 URL 的信息,请参阅 link。

也许您一直在努力提供帮助,并且 trim 从您的示例中删除您认为多余的代码,但您的代码似乎还有很多其他问题。

$filesize = filesize($link);

并非所有文件操作都在所有文件包装器中实现 - 尽管 ssh_sftp2 是一个例外(请参阅前面的 link)。但是为什么要轮询大小呢?只读到 EOF。并不是说您的读取操作会起作用 - 上面的代码永远不会打开文件句柄。

每一个想法都行!它只是一个真正的空文件。

$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");
}