2015-10-06 81 views
1

返回未讀字節我正在使用自定義類通過php連接到星號服務器。 這是代碼:通過fsockopen和socket_get_status的星號AMI PHP。 socket_get_status比

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,我試試吧。

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最後一個字符串alwas丟失。但是,當我通過星號控制檯檢查GetConfig時,它會返回完整配置。 正如你所看到的,當循環中斷socket_get_status的未讀字節爲0時,我檢查了它們在數組中推進並傾倒它,並且我可以看到unread_bytes實際上是0.我嘗試更改sleep_time和不同的超時參數,結果是相同。 我還能檢查什麼?什麼會導致這個錯誤?可能我可以使用其他func?

+0

另外問你是否不明白課堂上的東西,我會解釋。 –

回答

1

真的,我找到的唯一正確的解決方案是使用PAMI,而不是自定義類。它使用起來更舒服,反正它給了我完整的extensions.conf內容。