gpt4 book ai didi

php - 使用 PHP 网络传输大量小文件的快速方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:39:24 24 4
gpt4 key购买 nike

我在同一个局域网中有 2 个 Linux 服务器。
使用 PHP,我需要将 100000 个小 (10KB) 文件从服务器 A 复制到服务器 B。

现在我正在使用 ssh2_scp_send 并且它非常慢(20 分钟内 10K 个文件)。

如何让它更快?

最佳答案

通过 SSH 隧道使用 gzip 压缩的 TAR 非常快。数量级比纯 scp 快,特别是对于许多小文件。以下是 linux 命令行的示例:

user@local# cd /source/ ; tar czf - * | ssh user@remote "cd /target/ ; tar xzf -"


更新: 根据要求,这里您使用纯 PHP 解决方案 - 摆弄这个棘手的部分很有趣。

注意:你需要PHPs libssh extension为此工作。此外,STDIN 似乎仅在使用 SSH 流包装器时可用。

这几乎没有开销,因为它直接对流进行操作,并且您的 CPU 很可能总是比您用于传输的网络链接更快。

要权衡网络速度与 CPU 速度,您可以从命令行中删除选项 -z。 (更少的 CPU 使用率,但更多的在线数据)

代码示例:

<?php
$local_cmd = "cd /tmp/source && tar -czf - *";
$remote_cmd = "tar -C /tmp/target -xzf -";

$ssh = new SSH_Connection('localhost');
$auth = $ssh->auth_password('gast', 'gast');
$bytes = $ssh->command_pipe($local_cmd, $remote_cmd);
echo "finished: $bytes bytes of data transfered\n";

class SSH_Connection {
private $link;
private $auth;

function __construct ($host, $port=22) {
$this->link = @ssh2_connect('localhost', 22);
}

function auth_password ($username, $password) {
if (!is_resource($this->link))
return false;
$this->auth = @ssh2_auth_password($this->link, $username, $password);
return $this->auth;
}

function command_pipe ($localcmd, $remotecmd) {
if (!is_resource($this->link) || !$this->auth)
return false;
// open remote command stream (STDIN)
$remote_stream = fopen("ssh2.exec://{$this->link}/$remotecmd", 'rw');
if (!is_resource($remote_stream))
return false;
// open local command stream (STDOUT)
$local_stream = popen($localcmd, 'r');
if (!is_resource($local_stream))
return false;
// connect both, pipe data from local to remote
$bytes = 0;
while (!feof($local_stream))
$bytes += fwrite($remote_stream,fread($local_stream,8192));
// close streams
fclose($local_stream);
fclose($remote_stream);
return $bytes;
}

function is_connected () { return is_resource($this->link); }
function is_authenticated () { return $this->auth; }
}

关于php - 使用 PHP 网络传输大量小文件的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10513975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com