Php ssh2\u scp\u send()无法在一台服务器上传输整个文件

Php ssh2\u scp\u send()无法在一台服务器上传输整个文件,php,ssh,scp,Php,Ssh,Scp,我使用ssh2_scp_send函数通过ssh方式将文件从一个服务器发送到另一个服务器。 测试脚本和实际应用程序在我的Ubuntu工作站上运行良好,在它和远程服务器之间,在我的Windows PC和我办公室的开发CentOS 5.0 Linux服务器之间。 在我的客户处,ssh2_scp_发送停止,返回false,发送的文件被截断2MB,为6.5MB。发送方服务器和接收方服务器都使用CentOS 5.5,是VmWare Vsphere虚拟机监控程序上的虚拟服务器。两者之间有一个虚拟的本地网络。

我使用ssh2_scp_send函数通过ssh方式将文件从一个服务器发送到另一个服务器。 测试脚本和实际应用程序在我的Ubuntu工作站上运行良好,在它和远程服务器之间,在我的Windows PC和我办公室的开发CentOS 5.0 Linux服务器之间。 在我的客户处,ssh2_scp_发送停止,返回false,发送的文件被截断2MB,为6.5MB。发送方服务器和接收方服务器都使用CentOS 5.5,是VmWare Vsphere虚拟机监控程序上的虚拟服务器。两者之间有一个虚拟的本地网络。 较小的文件不会被截断。每台服务器上都有足够的磁盘空间

以下是测试脚本:

<?php

$source = '/sourcefile.dat';
$dest = '/destfile.dat';

$serveur = 'sshserver';
$login = 'login';
$sPub = 'public_key';
$sPriv = 'private_key';
$passphrase = 'pass';

$aSSHMethods = array(
        'kex' => 'diffie-hellman-group1-sha1',
        'client_to_server' => array(
                'crypt' => '3des-cbc,aes256-cbc,aes192-cbc,aes128-cbc',
                'comp' => 'none'),
        'server_to_client' => array(
                'crypt' => '3des-cbc,aes256-cbc,aes192-cbc,aes128-cbc',
                'comp' => 'none'),
        );

$rSSH = ssh2_connect($serveur, 22, $aSSHMethods);   
ssh2_auth_pubkey_file($rSSH, $login, $sPub, $sPriv, $passphrase);
ssh2_scp_send($rSSH, $source, $dest);
我试图用ssh2_sftp/fopen/fwrite/fclose替换ssh2_scp_send,但它的运行方式相同,速度较慢

我怎么能理解为什么Transfer挂了?目标服务器上的sshd日志只显示连接和断开连接


感谢windows上的ssh\u scp,它似乎保持连接打开,并将文件挂在缓冲区中

尝试显式调用exit以关闭将文件内容刷新到磁盘的会话:

<?php 
  $objConnection = ssh2_connect($strHost, $strPort, $methods, $callbacks); 
  ssh2_auth_password($objConnection, $strUser, $strPassword); 
  ssh2_scp_send($objConnection , $strSource, $strDest); 

  // Add this to flush buffers/close session 
  ssh2_exec($objConnection, 'exit'); 

不确定这是否能解决您的问题,但可能值得一试。

事实上,我的客户今天早上告诉我,ssh2\u sftp/fopen/fwrite/fclose解决方案比ssh2\u scp\u send one运行得更好。我按512kb的块读取和写入数据。他的第一个回答不准确。
但是我仍然不明白为什么ssh2\u scp\u send会在几个盒子上运行,而不是在其他盒子上运行。可能stefgosselin有部分答案。

函数ssh2\u scp\u send会在错误状态下停止,在我的情况下,我只有一个Linux盒子,但我会尝试。