首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Asterisk AMI PHP通过fsockopen和socket_get_status。socket_get_status在返回未读字节之前返回未读字节

Asterisk AMI PHP通过fsockopen和socket_get_status。socket_get_status在返回未读字节之前返回未读字节
EN

Stack Overflow用户
提问于 2015-10-06 13:13:29
回答 1查看 797关注 0票数 1

我使用自定义类通过php连接到asterisk服务器。下面是代码:

代码语言:javascript
复制
class Asterisk_ami
{
    public $ini = array();

    function __construct ()
    {
        $this->ini["con"] = false;
        $this->ini["host"] = "127.0.0.1";
        $this->ini["port"] = "****";
        $this->ini["lastActionID"] = 0;
        $this->ini["lastRead"] = array();
        $this->ini["sleep_time"]=1.5;
        $this->ini["login"] = "****";
        $this->ini["password"] = "****";
    }

    function __destruct()
    {
        unset ($this->ini);
    }

    public function connect()
    {
        $this->ini["con"] = fsockopen($this->ini["host"], $this->ini["port"],$a,$b,10);
        if ($this->ini["con"])
        {
            stream_set_timeout($this->ini["con"], 0, 400000);
        }
    }

    public function disconnect()
    {
        if ($this->ini["con"])
        {
            fclose($this->ini["con"]);
        }
    }

    public function write($a)
    {
        $this->ini["lastActionID"] = rand (10000000000000000,99999999900000000);
        fwrite($this->ini["con"], "ActionID: ".$this->ini["lastActionID"]."\r\n$a\r\n\r\n");
        $this->sleepi();
        return $this->ini["lastActionID"];
    }

    public function sleepi ()
    {
        sleep($this->ini["sleep_time"]);
    }

    public function read()
    {
        $mm = array();
        $b = array();
        $mmmArray=array();
        $k = 0;
        $s = "";
        $this->sleepi();
        do
        {
            $s.= fread($this->ini["con"],1024);
            sleep(0.005);
            $mmm=socket_get_status($this->ini["con"]);
            array_push($mmmArray, $mmm);
        }   while ($mmm['unread_bytes']);
        $mm = explode ("\r\n",$s);
        $this->ini["lastRead"] = array();
        for ($i=0;$i<count($mm);$i++)
        {
            if ($mm[$i]=="")
            {
                $k++;
            }
            $m = explode(":",$mm[$i]);
            if (isset($m[1]))
            {
                $this->ini["lastRead"][$k][trim($m[0])] = trim($m[1]);
            }
        }
        unset ($b);
        unset ($k);
        unset ($mm);
        unset ($mm);
        unset ($mmm);
        unset ($i);
        unset ($s);
        var_dump($mmmArray);
        return $this->ini["lastRead"];
        //return $s;
    }

    public function init()
    {
     return $this->write("Action: Login\r\nUsername: ".$this->ini["login"]."\r\nSecret: ".$this->ini["password"]."\r\n\r\n");
    }
}

这是我尝试过的testAsterisk.php。

代码语言:javascript
复制
include("./lib/asteriskAmi.php");
$a = new Asterisk_ami();
$a->connect();
if ($a->ini["con"])
{
    $a->init();
    $a->write("Action: GetConfig\r\nFilename: extensions.conf\r\n");
    print_r($a->read());
    $a->disconnect();
}

我想通过ami获取extension.conf配置。问题是我没有得到完整的配置。16最后一个字符串已经丢失。然而,当我通过asterisk控制台检查GetConfig时,它返回完整的配置。正如你所看到的,当socket_get_status的未读字节为0时,循环被中断,我检查了它们在数组中的推送和转储,我可以看到unread_bytes实际上是0。我尝试更改sleep_time和不同的超时参数,结果是相同的。我还可以检查什么?是什么导致了这个错误?也许我可以使用一些其他的功能?

EN

回答 1

Stack Overflow用户

发布于 2015-10-06 17:07:33

实际上,我找到的唯一合适的解决方案是使用PAMI,而不是自定义类。它使用起来更舒适,而且它为我提供了完整的extensions.conf内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32962176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档