【问题标题】:fopen via ssh doesn't retrieve the entire filefopen 通过 ssh 不会检索整个文件
【发布时间】:2016-12-25 22:25:28
【问题描述】:

我必须用 fopen 打开一个文件并阅读全部内容。 该文件可通过 ssh-sftp 连接访问:

这是我连接、打开和读取文件的代码:

//ssh connection
$connection = ssh2_connect($host, $port);
//open the file
$handle = fopen("ssh2.sftp://$sftp".$file, "r");
$out = array();
//read the file
while (($fields = fgetcsv($handle, 0, ";")) !== FALSE) {
   $out[]=$fields;
}

该文件实际上是一个 csv 文件。使用 fgetcsv 我逐行读取文件。 但是,即使我的文件在大约 20 行之后有 50 行,fgetcsv 也会失败并且我的最终输出数组不完整。 该文件实际上是我机器上的本地文件:如果通过 ssh 打开,则仅读取前 20 行,如果使用直接文件系统路径正常打开:

fopen("localpath", "r");

while 循环读取所有 50 行。

从 ssh 连接读取时是否有字节限制?可以使用 php.ini 配置选项更改此限制吗?

【问题讨论】:

    标签: php ssh


    【解决方案1】:

    我的建议:试试phpseclib, a pure PHP SFTP implementation。例如。

    <?php
    include('Net/SFTP.php');
    
    $sftp = new Net_SFTP('www.domain.tld');
    if (!$sftp->login('username', 'password')) {
        exit('Login Failed');
    }
    
    $csv = $sftp->get('filename.ext');
    
    $handle = fopen('php://memory', 'r+');
    fputs($handle, $csv);
    rewind($handle);
    
    while (($fields = fgetcsv($handle, 0, ";")) !== FALSE) {
       $out[]=$fields;
    }
    ?>
    

    即使它不起作用(我认为它很有可能会),phpseclib 也支持日志记录,因此您可以准确地看到它在哪里搞砸了。就像你的 SSH 服务器有问题,你收到一个 SSH 数据包,上面写着“服务器不支持发送大于 8k 的文件”。如果是这种情况,libssh2 不会告诉您,而 phpseclib 可以(好吧,如果您启用日志记录,默认情况下不会启用)。

    不管怎样,试试吧。如果您需要,我会从那里帮助您!

    【讨论】:

      【解决方案2】:

      尝试使用 file_get_contents() 获取整个文件,然后解析 CSV 数据。

      【讨论】:

      • 我试过了。但什么都没有改变。实际上 in 只能接收文件的前 8192 个字节。我还尝试了 ssh2_scp_recv,在这种情况下,即使原始文件是 15kbyte,从 scp 获取的文件也是 8kbyte。似乎某处有 8kbyte 的限制。
      • 你能提供更多细节吗?操作系统/PHP版本/Apache版本等
      • 我用 php 5.1 运行 linux red hat entrprise 6.0。我设法解决了这个问题:实际上我试图访问的远程文件是在我的 fopen 运行之前在幕后创建的。 “幕后”代码使用 fread 创建文件(从另一个原始文件读取)。使用 php 5.1 fread 显示此错误bugs.php.net/bug.php?id=35859&edit=2:读取文件时限制为 8k。感谢您的建议
      【解决方案3】:

      我正在回答我自己的问题以明确问题:

      我使用 php 5.1 运行 linux red hat entrprise 6.0。我设法解决了这个问题:实际上我试图访问的远程文件是在我的 fopen 运行之前在幕后创建的。 “幕后”代码使用 fread 创建文件(从另一个原始文件读取)。使用 php 5.1 fread 显示此错误 bugs.php.net/bug.php?id=35859&edit=2: 读取文件时限制为 8k。所以之后 in 可以通过多种方式访问​​该文件,但它的大小仍然是 8k 并且其他内容都丢失了。

      【讨论】:

        猜你喜欢
        • 2021-07-07
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-27
        • 2011-01-31
        • 2016-09-18
        相关资源
        最近更新 更多