Адекватный sftp для PHP - PullRequest
0 голосов
/ 24 мая 2018

Мне нужно осуществить загрузку файлов с сервера sftp с помощью PHP7.Я вижу, у меня есть 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
)

Я просто не могу поверить, что не существует нормальной реализации sftp для PHP.

В то же время мне удается получить файлы с оболочкой sftpклиент.

ОБНОВЛЕНИЕ

$sftp = ssh2_sftp($connection)

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Каждая мысль работает!Это был просто пустой файл.

$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");
}
0 голосов
/ 24 мая 2018

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

Это неверный URL : это означает, что данные находятся на хостес именем «36», которое не допускается в качестве DNS-имени, но вы, похоже, сделали это преднамеренно - intval($sftp).Чтобы узнать, как создать URL, см. Ссылку.

Возможно, вы пытались помочь и обрезали код, который, по вашему мнению, излишним из вашего примера, но в вашем коде, похоже, много других проблем.

$ filesize = filesize ($ link);

Не все файловые операции реализованы во всех оболочках файлов - хотя ssh_sftp2 является исключением (см. Предыдущую ссылку).Но зачем опрашивать размер?Просто читай в EOF.Не то чтобы ваши операции чтения сработали - приведенный выше код никогда не открывает дескриптор файла.

...