Регистрация Войти
Войти через VK Войти через FB Войти через Google Войти через Яндекс
Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Наш чат в Telegram для обмена идеями, проектами, мыслями, людьми в сфере ИТ г.Ростова-на-Дону: @it_rostov
Генерация XML запроса к серверу и парсинг ответа
При анализе чужих кодов можно наблюдать интересные приемы программирования. На мой взгляд самое лучшее обучение, это учиться у мастеров своего дела.
Анализируя код биржи статей Liex, я обратил внимание на простой и компактный код, с помощью которого система обращается на сервер с помощью POST запроса, передает XML запрос, получает XML ответ, разбирает его и сохраняет в файл. Все красиво, компактно и понятно. Удалил немного лишнего и добавил коментарии:
// Генерация XML запроса к серверу (подсмотрено у Liex)
$xml = "<?xml version=\"1.0\" encoding=\"Windows-1251\"?>\n<xmlRequest>\n";
$xml .= "\t<host>$host</host>\n";
$xml .= "\t<script md5=\"".strtoupper(md5_file(__FILE__))."\"/>\n";
if (file_exists($index_page)&&(is_file($index_page)))
$xml .= "\t<index md5=\"".strtoupper(md5_file($index_page))."\"/>\n";
foreach($local_base as $id=>$_md5)
$xml .= "\t<article id=\"$id\" md5=\"$_md5\"/>\n";
$xml .= '</xmlRequest>';
// Генерация и отправка HTTP запроса к серверу
$content = 'data='.urlencode($xml);
$content_length = strlen($content);
unset($xml);
foreach ($srvs as $serv => $path) {
$query = "POST $path HTTP/1.0\r\n";
$query .= "Host: $serv\r\n";
$query .= "Connection: close\r\n";
$query .= "Content-Type: application/x-www-form-urlencoded\r\n";
$query .= "Content-Length: $content_length\r\n";
$query .= "\r\n";
$query .= $content;
$fh = fsockopen($serv, 80, $errno, $errstr, 10);
if (!$fh) continue;
stream_set_timeout($fh, 20);
fwrite($fh, $query);
if (feof($fh)) continue;
$line = fgets($fh);
if (!$line) continue;
$code = split(' ', $line);
if (!$code || count($code) < 2) continue;
$code = $code[1];
if (substr($code, 0, 1) != '2') continue;
while(!feof($fh)) {
$line = fgets($fh);
if ($line == "\r\n") break;
}
if (!feof($fh)) {
$conn_ok = true;
break;
}
}
unset($content);
unset($query);
if ((!isset($conn_ok) || !$conn_ok) && !is_file($index_page))
exit("Error occurred:\nCan't connect to server");
// xml парсинг ответа
$xml_parser = xml_parser_create('ISO-8859-1');
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
xml_set_element_handler($xml_parser, 'start_element_handler', 'end_element_handler');
xml_set_character_data_handler($xml_parser, 'character_data_handler');
while (!feof($fh))
xml_parse($xml_parser, fread($fh, 8192));
fclose($fh);
xml_parser_free($xml_parser);