PHP 足够的 sftp
Adequate sftp for PHP
我需要使用 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)
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");
}
我需要使用 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)
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");
}