AAA Главная
Примеры PHP Примеры JavaScript Примеры Ajax Примеры CSS,HTML

Генерация 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);

. Читайте на сайте 0432.ua как правильно выбирать выделенный сервер.

© Copyright 2008-2017 by KDG