【问题标题】:Looping through large xml response then sending element back in another loop for response循环遍历大型 xml 响应,然后在另一个循环中将元素发送回以进行响应
【发布时间】:2012-08-30 03:13:46
【问题描述】:

必须有更好的方法!这是我的代码:

checksession();
$restNew2 = new RESTConnector();


$urlNew2 = "https://localhost:9630/api/products/";
$restNew2->createRequest($urlNew2,"GET", null, $_SESSION['cookies'][0]);
$restNew2->sendRequest();


$responseNew2 = $restNew2->getResponse();
$xmlNew2 = new SimpleXMLElement($responseNew2);

foreach ($xmlNew2 as $purge){
    $id = (string)$purge->attributes()->id;

checksession();
$restNew = new RESTConnector();


$urlNew = "https://localhost:9630/api/products/".$id."/";
$restNew->createRequest($urlNew2,"GET", null, $_SESSION['cookies'][0]);
$restNew->sendRequest();


$responseNew = $restNew->getResponse();
$xmlNew[] = new SimpleXMLElement($responseNew);



}
$array = array();

foreach ($xmlNew as $purgeDet){
    $code[] = (string)$purgeDet->code;
    $classId[] = (string)$purgeDet->class['id'];
    for($i=0, $count = count($xmlNew); $i < $count; $i++) {
$array[$code[$i]]['classId'] = $classId[$i];
    }
}
print_r($array);

第一个响应给了我大约 300,000 行,所以我必须解析它以获取产品的 id,以便发送另一个请求以获取产品的完整呈现。它最终发送了大约 40,000 个请求。我希望在晚上使用 cron 将它插入到 mySQL 数据库中,这样我就可以在第二天创建关于它的报告。有任何想法吗?谢谢!

【问题讨论】:

  • 您可以将结果存储在一个数组中,然后为每个数组执行一次,但如果您可以将数据缓存在数据库中,那就更好了!

标签: php xml api


【解决方案1】:

我要分块做。进行第一个 API 调用并遍历它,构建一个仅包含 ID 的列表并存储它。 Id 将它们存储在每行 1 个的文件中...然后您可以稍后逐行保存文件,而不是将整个数组加载到缓冲区中,或者您仍然可以将文件读取到数组中...无论哪个最终成为更好的解决方案.

然后读取文件并遍历 ID 进行详细调用并存储它们。

更新

您还可以使用 xpath 查询在编译端获取 ID。

$xmlNew2->xpath("//THE_ELEMENT_WITH_THE_ID/@id");

但我不知道这是否会为你节省很多,因为你仍然需要循环这个......它只是节省了你必须在每个节点上调用SimpleXMLElement::attributes。但结果仍然是属性元素数组。

【讨论】:

  • 我知道不调用整个数组可以节省内存,但我仍然需要创建 40,000 个 REST 请求来获取每个产品的详细信息。
  • 好吧,如果 API 不允许您一次抓取多个,那么我认为不会有任何其他方式。您可以只将该项目标记为需要更新,然后在运行报告并需要该项目的详细信息之前实际上不调用完整信息 - 然后在那时存储详细级别数据。
  • 另外,也无需遍历整个 xml,只需使用 xpath 即可获得所需的内容。发布更新我的答案...
  • xpath 可能会更快一些,即使我获得了大部分属性。我会测试并告诉你。谢谢。顺便说一句,喜欢你的用户名。
猜你喜欢
  • 1970-01-01
  • 2017-08-29
  • 2012-11-23
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 2020-06-25
相关资源
最近更新 更多