0

我正在将监控软件 (PRTG) 中的 API 集成到我们的网站中,并尝试使用生成 XML 格式数据列表的函数。由于它是根据需要生成的,因此 URL 不指向现有文件。

我尝试使用“simplexml_load_file”和“simplexml_load_string”并没有运气传递 URL。我也尝试过使用“file_put_contents”首先保存文件,但它也失败了,因为 URL 实际上并不指向文件。

如何使它起作用?

<?php

$prtg_url = "http://prtg.domain.net:8080/";
$prtg_user = "username";
$prtg_hash = "passwordhash";

function getSensorData($deviceid)
{
    $sensor_xml_file = $GLOBALS['prtg_url'] . "api/table.xml?content=sensors&output=xml&columns=objid,type,device,sensor,status&id=" . $deviceid . "&username=" . $GLOBALS['prtg_user'] . "&passhash=" . $GLOBALS['prtg_hash'];
    file_put_contents("sensor.xml", fopen($sensor_xml_file, 'r'));

    $sensors = simplexml_load_file("sensor.xml");

    foreach ($sensors->item as $sensor)
    {
        $sensor_ping = $sensor->ping;
        $sensor_id = $sensor->objid;
        $sensor_type = $sensor->type;
        $sensor_typeraw = $sensor->type_raw;

        echo $sensor_ping . "</br>";
        echo $sensor_id . "</br>";
        echo $sensor_type . "</br>";
        echo $sensor_typeraw . "</br>";
    }
}

getSensorData("3401");

?>
4

3 回答 3

0

这可能与文件处理程序有关。您可以尝试将 simplexml_load_file() 与您的 URL 一起使用。例如:

$url = $GLOBALS['prtg_url']
       . "api/table.xml?content=sensors&output=xml&columns=objid,type,device,sensor,status&id=" 
       . $deviceid . "&username=" . $GLOBALS['prtg_user'] 
       . "&passhash=" . $GLOBALS['prtg_hash']);
$xml = simplexml_load_file($url);
于 2013-09-03T18:24:42.647 回答
0

试试这个:

$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_URL, $sensor_xml_file);
$xmlString = curl_exec($c);
curl_close($c);
$sensors = simplexml_load_string($xmlString);
于 2013-09-03T18:35:17.730 回答
0
$opts = array('http' =>
  array(
    'method'  => 'GET',
    'header'  => "Content-Type: text/xml\r\n",          
    'timeout' => 60
  )
);

$context  = stream_context_create($opts);

$url = $GLOBALS['prtg_url']
   . "api/table.xml?content=sensors&output=xml&columns=objid,type,device,sensor,status&id=" 
   . $deviceid . "&username=" . $GLOBALS['prtg_user'] 
   . "&passhash=" . $GLOBALS['prtg_hash']);
$result = file_get_contents($url, false, $context);

echo $results;

这会强制操作超时 60 秒,这样您就可以查看它是否实际获取任何结果。如果它确实返回不完整的结果,请切换到使用 XMLReader 作为您的解析器。

于 2013-09-03T19:17:08.217 回答