php数组没有返回完全放出

时间:2013-07-02 04:53:39

标签: php arrays shell

我有一个php代码,它将ssh到远程机器并执行shell脚本来获取文件夹列表。远程机器在shell脚本的指定路径中包含300多个文件夹.Shell脚本执行良好并返回所有文件夹的列表。但是当我在php中检索此输出时,我只得到大约150,200个文件夹

这是我的PHP代码,

    <?php
    if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");
    if(!($con = ssh2_connect("ip.add.re.ss", "port")))
    {
        echo "fail: unable to establish connection";
        }
    else
    {
        if(!ssh2_auth_password($con, "username", "password"))
    {
        echo "fail: unable to authenticate";
    }
    else
        {
        $stream = ssh2_exec($con, "/usr/local/listdomain/listproject.sh");
        stream_set_blocking($stream, true);
        $item = fread($stream,4096);
        $items = explode(" ", $item);
        print_r($items);
    }
        }
    ?>

这是我的shell脚本。

#!/bin/bash
var=$(ls /home);
echo $var;

这里的php有什么问题。在这里动态获取数据时,php中的数组大小是否有任何限制。请告知我,我是PHP的初学者。

感谢。

2 个答案:

答案 0 :(得分:0)

您只从流中读取一个包含4096个字符的块。如果您的文件夹列表长于此值,您将丢失其余部分。你需要这样的东西:

    stream_set_blocking($stream, true);
    $item = "";
    // continue reading while there's more data
    while ($input = fread($stream,4096)) {
       $item .= $input;
    }

    $items = explode(" ", $item);
    print_r($items);

答案 1 :(得分:0)

您要求fread()仅读取4096个字节。在fread()文档的示例部分中,建议使用stream_get_contents()来读取文件句柄。否则,您必须使用循环并继续读取数据,直到feof($stream)返回FALSE