【问题标题】:Accessing XML Data From PHP cURL while it's running在 PHP cURL 运行时从 PHP cURL 访问 XML 数据
【发布时间】:2014-03-27 14:49:04
【问题描述】:

我有以下代码

 $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 运行时访问该数据。我尝试过使用流,并将数据写入文件,但它们似乎都不起作用。 cURL 请求工作正常。刚运行时它返回 550 字节,当发生应该返回数据的事件时,它返回 9100 字节。这让我相信正在发生正确的事情,但我不知道如何从 curl 访问数据。

我需要 curl 持续运行,这是为了通过我们的托管服务提供商提供的 api 来监控我们的电话系统。

【问题讨论】:

  • 只是为了澄清:I need to the curl to run continuously 即 http 连接既没有关闭也没有响应“完成” - 服务器或多或少地在一个永无止境的 http 响应中“流式传输”事件?
  • 是的,没错。我本来可以更清楚的。当我们不再需要它时,有一个用于关闭连接的 api 调用。

标签: php curl


【解决方案1】:

按照http://docs.php.net/manual/en/function.curl-setopt.php 中的说明尝试 CURLOPT_WRITEFUNCTION

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);

棘手的一方将解析 xml 数据,因为不能保证每个块(即 $data)都是一个 xml 数据包 - 甚至可能不保证每个块都属于一个 xml 元素/文档。
尝试找到一个 xml sax/pull 解析器,它获取数据块并尽可能地解析它们(......并告诉你它确实消耗了多少数据,这样你就可以在调用之间存储剩余的数据和/或重新开始下一个元素/文档)。
在这种特殊情况下,也许……只是也许,我会使用正则表达式来查找事件的开始和结束标记,然后将该(子)字符串放入 xml 解析器中。

【讨论】:

  • 这正是我所需要的。谢谢你。如果将来有人遇到问题,CURLOPT_WRITEFUNCTION 必须在 curl_exec 之前进行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 2021-06-14
  • 2014-07-11
  • 1970-01-01
  • 2019-03-22
  • 2012-07-18
相关资源
最近更新 更多