【问题标题】:How to generate XML from multiple cURL calls (with PHP)?如何从多个 cURL 调用(使用 PHP)生成 XML?
【发布时间】:2016-02-05 00:13:18
【问题描述】:

伙计们。

我在尝试解决这个问题时遇到了严重的麻烦。

场景:

在工作中,我们使用漏洞管理工具 QualysGuard。 跳过所有技术细节,该工具基本上检测所有服务器中的漏洞,并为每台服务器中的每个漏洞创建一个票号。 从 UI 中,我可以访问所有这些票证并下载所有票证的 CSV 文件。 另一种方法是使用 API。 API 使用一些 cURL 调用来访问数据库并检索我在参数中指定的信息。

方法:

我正在使用这样的脚本来获取数据:

<?php
$username="myUserName"; 
$password="myPassword"; 
$proxy= "myProxy";
$proxyauth = 'myProxyUser:myProxyPassword';


$url="https://qualysapi.qualys.com/msp/ticket_list.php?"; //This is the official script, provided by Qualys, for doing this task.

$postdata = "show_vuln_details=0&SINCE_TICKET_NUMBER=1&CURRENT_STATE=Open&ASSET_GROUPS=All"; 

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_REFERER, $url); 
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata); 
curl_setopt ($ch, CURLOPT_POST, 1); 
$result = curl_exec ($ch); 

$xml = simplexml_load_string($result);
?>

上面的脚本运行良好。它连接到 API,将一些参数传递给它,ticket_list.php 文件会生成一个包含我需要的所有内容的 XML 文件。

问题:

1-) 此脚本只允许在它返回的 XML 文件中限制 1000 个结果。 如果我的请求产生了超过 1000 个结果,脚本会在 XML 的末尾创建一个这样的 TAG:

<TRUNCATION last="5066">Truncated after 1000 records</TRUNCATION>

在这种情况下,我需要执行另一个 cURL 调用,参数如下:

$postdata = "show_vuln_details=0&SINCE_TICKET_NUMBER=5066&CURRENT_STATE=Open&ASSET_GROUPS=All";

2-) Qualys 的数据库(云)中大约有 300,000 张工单,我需要将它们全部下载并插入到我的数据库中,该数据库由我正在使用的应用程序使用创造。这个应用程序有一些表单,由用户填写,并针对数据库运行一堆查询。

疑问: 我完成上述任务的最佳方式是什么? 我有一些想法,但我完全不知所措。 我想:

**1-)**创建一个执行上述调用的函数,解析 xml 和标签 TRUNCATION 存在,它获取它的值并再次调用它自己,递归地执行它直到没有标签 TRUNCATION 的结果。 这个问题是我无法合并每个调用的 XML 结果,而且我不确定它是否会导致内存问题,因为它需要近 300 个 cURL 调用。该脚本会在非营业时间使用服务器的 cronTab 自动执行。

2-) 我没有检索所有数据,而是制作我提到的表单,将数据发布到脚本,并使用用户 POSTed 的参数进行 cURL 调用.但同样我不确定这是否会好,因为我仍然需要进行多次调用,具体取决于用户发送的参数。

3-) 这太疯狂了: 在我登录 UI 时使用某种宏软件记录我,进入门票所在的页面,点击下载按钮,检查 CSV 选项并单击以再次下载。然后,将此脚本导出为某种语言,如 python 或 java,在 cronTab 中创建一个任务,并创建一个解析下载的 CSV 并将数据插入数据库的脚本。 (疯狂与否?=P)

非常欢迎任何帮助,也许答案就在我眼前,而我还没有得到。 提前致谢!

【问题讨论】:

    标签: php xml curl recursion


    【解决方案1】:

    我相信正确的方法会涉及队列工作者,但是,如果我是你,我会让你的脚本在一次执行中抓取 5 个这些 XML 文件 - 抓取 1 个,插入行,从内存中删除,重复。然后,我会通过手动运行几次来测试它,看看它需要什么样的执行时间和内存。一旦您对执行时间有了一个很好的了解并且您可以看到内存不会成为问题,那么将 cron 安排为该时间的两倍以下。如果一切顺利,两次运行之间应该有大约一分钟的时间,您可以在一小时内将其全部保存到您的数据库中。

    【讨论】:

    • 你好,米克尔。谢谢回答。这个解决方案的问题(理论上非常好)是我能以 CSV 格式获取数据的唯一方法是通过 UI,而不是通过 API。所以我需要某种脚本来登录我的帐户,浏览网站,单击一些按钮并等待下载完成。我不知道我怎么能做到这一点......
    • @AbnerMuniz 嘿 Abner!我的错,我的意思是 XML。每次执行使用 API 5 次。像你一样抓取 XML,xpath->query 到你想要保存的项目,foreach() 并将它们插入到你的数据库中。然后,从内存中清除所有内容并重复。这样做 5 次。该脚本应该能够处理 5000 次插入而不会出现太多问题。如果遇到问题,请考虑构建单个插入而不是单独运行它们并检查性能差异。
    • 我知道你在哪里,我只是不确定我是否得到了重复部分。你怎么建议我重复执行?通过将截断值保存在变量中并使用do-while?抱歉,我想了很久,现在还想不明白哈哈
    • 好吧,您可以编写一个函数,从特定的起始编号获取记录,但假定为 0。然后,在该函数中,接近末尾,如果响应具有截断标记,则取消设置当前xml 并使用截断标记的编号作为起始编号再次调用该函数。每次调用时,增加一个全局变量,如果该全局变量变为 5- 退出。编辑:考虑沿途投票 - 它激励帮助,所以你会得到更多;D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    相关资源
    最近更新 更多