2014-03-27 44 views
0

我有以下代碼訪問XML數據從PHP捲曲,而它的運行

$URL = 'https://hostedconnect.m5net.com/bobl/bobl'; 
    $xml = '<Command xmlns:m5="http://www.m5net.com/org/m5/data/v2/cti" xmlns:csta="http://www.ecma-international.org/standards/ecma-323/csta/ed5"> 
       <ApplicationContext>BoblConsole</ApplicationContext> 
        <Arguments xsi:type="org.m5.data.v2.cti.HostedConnectObject" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
         <csta:MonitorStart> 
          <csta:monitorObject> 
           <csta:deviceObject>DEVICE</csta:deviceObject> 
          </csta:monitorObject> 
         </csta:MonitorStart> 
        </Arguments> 
        <FormattedXml>true</FormattedXml> 
        <Id>9</Id> 
        <Name>org.m5.apps.v2.cti.HostedConnect.request</Name> 
        <Password>PASSWORD</Password> 
        <User>USER</User> 
       </Command>'; 


    $ch = curl_init($URL); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_VERBOSE, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array (
      'Transfer-Encoding: chunked', 
      'Content-Encoding: chunked', 
      'Connection: keep-alive', 
      'Content-Type: text/xml' 
    )); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, "$xml"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $result = curl_exec($ch); 

    $test = stream_get_contents($fp_tmp); 

的API應該返回XML數據,但我不知道如何捲曲運行時訪問這些數據。我試過使用流,並將數據寫入文件,但它們都不起作用。 cURL請求正常運行。當運行它時會返回550個字節,當發生應該返回數據的事件時,它會返回9100個字節。這使我相信正確的事情正在發生,但我不知道如何從curl訪問數據。

我需要curl持續運行,這是爲了通過我們的託管服務提供商提供的api監控我們的電話系統。

+0

只是澄清:'我需要捲曲持續運行'即既沒有關閉http連接,也沒有響應「完成」 - 服務器或多或少地「流」事件在一個單一的http repsonse事件永遠不會結束? – VolkerK

+0

是的,這是正確的。我本可以更清楚。當我們不再需要它時,有一個關閉連接的API調用。 –

回答

1

http://docs.php.net/manual/en/function.curl-setopt.php

curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) { 
    static $buffer = ''; 
    $buffer .= $data; 
    // <-- parse xml data here --> 
    // <-- remove the consumed part from $buffer --> 
    return strlen($data); 
}); 
//curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

棘手的黨所描述的嘗試CURLOPT_WRITEFUNCTION將解析XML數據,因爲它不能保證每個單塊(即$數據)是一個XML包 - 可能甚至不是每個塊大概屬於一個xml元素/文檔。
嘗試找到一個xml薩克斯/拉解析器,它接收大塊數據並儘可能地解析它們(...並告訴您它消耗了多少數據,因此您可以將剩餘的數據存儲在調用之間和/或啓動結束下一個元素/文檔)。
在這種特殊情況下,也許...也許,我會恢復正則表達式來查找事件的開始和結束標記,然後將該(子)字符串放入xml解析器中。

+0

這就是我需要的。謝謝。如果將來有人遇到問題,CURLOPT_WRITEFUNCTION必須在curl_exec之前執行。 –