Регистрация Войти
Войти через VK Войти через FB Войти через Google Войти через Яндекс
Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Генерация 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);
.
Прокомментировать/Отблагодарить