如何使用PHP中的本机sftp函数和fwrite提高文件上载的性能

如何使用PHP中的本机sftp函数和fwrite提高文件上载的性能,php,upload,sftp,fwrite,ssh2-sftp,Php,Upload,Sftp,Fwrite,Ssh2 Sftp,嗨,我正在使用以下代码将一个大文件(500MB)上传到sftp服务器 <?php $connection = ssh2_connect($this->host, $this->port, null); $sftp = ssh2_sftp($connection); $connection_string = ((int) $sftp) . $remotePath . $remoteFilename; $stream = fopen('ssh2.sftp://' . $conn

嗨,我正在使用以下代码将一个大文件(500MB)上传到sftp服务器

<?php

$connection = ssh2_connect($this->host, $this->port, null);
$sftp = ssh2_sftp($connection);

$connection_string = ((int) $sftp) . $remotePath . $remoteFilename;
$stream = fopen('ssh2.sftp://' . $connection_string, 'w');
$source = fopen($localFilepath, 'r');

if (!$stream) {
    throw new Exception('Could not create file: ' . $connection_string);
}

while (!feof($source)) {
    // Chunk size 32 MB
    if (fwrite($stream, fread($source, 33554432)) === false) {
        throw new Exception('Could not send data: ' . $connection_string);
    }
}

fclose($source);
fclose($stream);

问题在于,即使先读取32MB,然后再将其写入sftp流,fwrite也会以不同的大小分块。我想只有几KB

对于文件系统(这是fwrite的常见情况),这是可以的,但由于向远程服务器进行fwrite,延迟不高

因此,解决方案是使用

stream_set_chunk_size($stream, 1024 * 1024);
因此,最终工作代码是:

<?php

$connection = ssh2_connect($this->host, $this->port, null);
$sftp = ssh2_sftp($connection);

$connection_string = ((int) $sftp) . $remotePath . $remoteFilename;
$stream = fopen('ssh2.sftp://' . $connection_string, 'w');
$source = fopen($localFilepath, 'r');

// Stream chunk size 1 MB
stream_set_chunk_size($stream, 1024 * 1024);

if (!$stream) {
    throw new Exception('Could not create file: ' . $connection_string);
}

while (!feof($source)) {
    // Chunk size 32 MB
    if (fwrite($stream, fread($source, 33554432)) === false) {
        throw new Exception('Could not send data: ' . $connection_string);
    }
}

fclose($source);
fclose($stream);

对于ssh2\u scp\u send,我不确定,因为它是另一个协议,不是吗?对于phpseclib,我遇到了一些模糊的公钥算法的问题。由于这是一项要求,用户可以设置关键算法并想要所有这些算法,我认为本地sftp将是最安全的选择。当然,通常他们支持它-但在这种情况下,我需要一个稳定的解决方案。因此,大多数人支持它不起作用。实际上,用户可以在scp和sftp之间进行选择,所以当他们选择sftp时,我很确定他们期望sftp。在这项工作一年后解决罕见的没有scp的sftp边缘案例听起来并不有趣^^^我不确定您是否知道我已经解决了这个问题并回答了这个问题(只是以前找不到答案,这就是为什么我在这里发布这个问题)问题确实是fwrite的块大小。它的默认值只有几KB,因为它通常用于文件系统。因此,是的,仅凭问题中提供的信息,可能本地sftp非常糟糕。但它似乎不是:)
stream\u set\u chunk\u size($stream,1024*1024)修复了此问题,请输入!编辑:是的,我需要等两天才能批准我自己的答案