Бортовой журнал Ктулху

Поврежденные файлы на сервере при закачке при помощи ssh2_scp_send в PHP

При использовании ssh2_scp_send на сервер приходят обрезанные в конце файлы. Это хорошо заметно на примере текстовых и картинок (просто другие файлы могут не открыться вообще). Проблема заключается в том, что вы не закрываете сеанс SSH. Таким образом, внутренние буферы не очищаются, и файлы полностью не записываются на диск.

Пример кода, в котором возникает проблема:

public function uploadFile($local_file, $remote_file)
 {
/* какой-то код */
ssh2_scp_send($this->connection, $local_file, $remote_file, 0644);
/* еще какой-то другой код */
}

Проблема возникает не всегда, возможно, зависит от ОС, версии библиотек, настроек SSH.

Вот обходной путь - просто закройте сеанс с помощью удаленного выполнения команды exit:

ssh2_exec($connection, 'exit');

Если же это не помогло, можно использовать альтернативное подключение, используя fopen:

$sftpStream = @fopen("ssh2.sftp://{$this->connection}/{$remote_file}", 'w');
$data_to_send = @file_get_contents($local_file);
@fwrite($sftpStream, $data_to_send);
fclose($sftpStream);