Как сгенерировать XML из нескольких вызовов cURL (с PHP)?

1

ребята.

У меня серьезные проблемы с этим.

Сценарий:

Здесь на работе мы используем инструмент управления уязвимостями QualysGuard. Пропуская все технические детали, этот инструмент в основном обнаруживает уязвимости на всех серверах, и для каждой уязвимости на каждом сервере он создает номер билета. Из пользовательского интерфейса я могу получить доступ ко всем этим билетам и загрузить файл 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-) Этот скрипт разрешает только предел 1000 результатов в возвращаемом XML файле. Если мой запрос сгенерировал более 1000 результатов, сценарий создает TAG, подобный этому, в конце XML:

<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-) Вместо того, чтобы извлекать все данные, я делаю упомянутые мною формы, помещая данные в скрипт и делая вызовы cURL с параметрами, которые пользователь POST редактировал. Но опять же я не уверен, что это будет хорошо, поскольку мне все равно придется выполнять несколько вызовов, в зависимости от параметров, которые отправляет пользователь.

3-) Это сумасшедший: используйте какое-то программное обеспечение Macro для записи меня, когда я вхожу в пользовательский интерфейс, перейдите на страницу, где находятся билеты, нажмите кнопку загрузки, проверьте параметр CSV и нажмите, чтобы снова загрузить, Затем экспортируйте этот скрипт на некоторый язык, например python или java, создайте задачу в cronTab и создайте скрипт, который анализирует CSV, загружает и вставляет данные в базу данных. (Сумасшедший или нет? = P)

Любая помощь очень приветствуется, возможно, ответ прямо на моих глазах, и я еще не получил ответа. Заранее спасибо!

Теги:
curl
recursion

1 ответ

0

Я полагаю, что правильный путь будет включать в себя сотрудника очереди, однако, если бы я был вами, я бы заставил ваш скрипт захватить 5 из этих файлов XML в одном execution- захвате 1, вставить строки, удалить из памяти, повторить. Затем я проверил его, запустив его несколько раз вручную, чтобы узнать, какое время выполнения и память он требует. Как только у вас есть хорошая идея о времени выполнения, и вы можете видеть, что память не будет проблемой, заплатите cron за чуть меньше этого времени. Если все идет хорошо, это должно быть около минуты между прогонами, и вы можете получить все это в своей БД в течение часа.

  • 1
    Привет, Микель. Спасибо за ответы. Проблема с этим решением (которое теоретически весьма неплохо) состоит в том, что единственный способ получить данные в формате CSV - через пользовательский интерфейс, а не через API. Поэтому мне понадобится какой-нибудь скрипт для входа в мою учетную запись, навигации по веб-сайту, нажатия некоторых кнопок и ожидания завершения загрузки. Я понятия не имею, как я мог бы сделать это ...
  • 0
    @AbnerMuniz Эй, Абнер! Моя вина, я имел в виду XML. Используйте API 5 раз за исполнение. Возьмите XML, как вы, xpath-> запросите элементы, которые вы хотите сохранить, foreach () и вставьте их в свою базу данных. Затем очистите все это из памяти и повторите. Сделайте это 5 раз. Скрипт должен уметь обрабатывать 5000 вставок без особых проблем. Если вы столкнулись с проблемами, рассмотрите возможность создания отдельной вставки вместо того, чтобы запускать их по отдельности, и проверьте разницу в производительности.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню