如何从多个cURL调用生成XML(使用PHP)?

时间:2015-11-04 13:15:07

标签: php xml curl recursion

我在试图解决这个问题时遇到了很多麻烦。

情景:

在工作中,我们使用漏洞管理工具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>

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

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

2 - ) Qualys的数据库(云)中有大约300,000张门票,我需要下载所有这些门票并插入MY数据库,我的应用程序使用它创建。此应用程序有一些表单,由用户填写,并对数据库运行一堆查询。

怀疑: 对我来说,完成上述任务的最佳方式是什么? 我有一些想法,但我完全失去了。 我想:

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

2 - )我将我提到的表单发布到脚本并使用用户{{1}的参数进行cURL调用,而不是检索所有数据。 }编辑。但是我再次确定这是不是很好,因为我仍然需要进行多次调用,具体取决于用户发送的参数。

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

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

1 个答案:

答案 0 :(得分:0)

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