Итак, раз уж я начал постить про парсеры и появляются варианты для одной и той же задачи - парсинга RSS потока, то задаётся вопрос, какой из них лучше? Проведём тест всех разновидностей, задачей будет каждым вариантом спарсить RSS поток этого блога и спарсить параметры title и link каждого поста. Будет 3 экземпляра парсеров для одной и той же задачи, а именно:
- Парсер, написанный на регулярках по статье Пишем RSS Reader;
- Парсер, написанный по статье Парсер своими руками. Теория;
- И парсер, написанный на SimpleXML.
Итак, начну с исходного кода каждого из них:
Парсер, написанный на регулярках по статье Пишем RSS Reader:
1 2 3 4 5 6 7 8 9 10 11 12 | $url="http://feeds.feedburner.com/romka?format=xml"; $xml = iconv('utf-8','windows-1251',file_get_contents($url)); $n = preg_match_all('!<item>.*<title>(.*)</title>.*<link>(.*)</link>.*</item>!Uis',$xml,$result); if($n) { for($a=0;$a<$n;$a++) { echo "<a href='".$result[2][$a]."'>".$result[1][$a]."</a><br />"; }; }; |
Парсер, написанный по статье Парсер своими руками. Теория:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $url = "http://feeds.feedburner.com/romka?format=xml"; $page = iconv('utf-8','windows-1251',file_get_contents($url)); $page = str_replace("'", "\'", $page ); $page = str_replace("*", "555", $page ); $page = str_replace("<"."?xml ", "<"."?php $"."n=0; /"."*", $page ); $page = str_replace("</rss>", "*"."/ ?".">", $page ); $page = str_replace("<item>", "*"."/ $"."n++; /"."*", $page); $page = str_replace("<title>", "*"."/ $"."title[$"."n]='", $page); $page = str_replace("</title>", "'; /"."*", $page); $page = str_replace("<link>", "*"."/ $"."link[$"."n]='", $page); $page = str_replace("</link>", "'; /"."*", $page); $f=fopen("file.php","w"); fwrite($f,$page); fclose($f); include('file.php'); for($a=1;$a<=$n;$a++) { echo "<a href='".$link[$a]."'>".$title[$a]."</a><br />"; }; |
Парсер, написанный на SimpleXML:
1 2 3 4 5 6 | $rss = simplexml_load_file('http://feeds.feedburner.com/romka?format=xml'); foreach ($rss->channel->item as $item) { echo "<a href='". $item->link. "'>". $item->title. "</a><br />"; }; |
Все они загружают RSS поток и выводят все записи в виде названия пост со ссылкой. Теперь будем засекать время обработки кода. Делать это будем при помощи такого кода:
1 2 3 4 5 6 7 8 9 10 11 | $mtime=microtime(); $mtime=explode(" ",$mtime); $tstart=$mtime[1] + $mtime[0]; //// Код парсера $mtime=microtime(); $mtime=explode(" ",$mtime); $tend=$mtime[1] + $mtime[0]; $totaltime=($tend - $tstart); printf ("%f", $totaltime); |
Как видно, больших отличий по времени нету, но есть большие отличаи по объёмности кода. Ясно видно, что использовать SimpleXML намного удобнее, чем что либо другое. Тем более, что парсеры №1 и №2 чувствительны к смене структуры, а в парсере №2 должен присутствовать файл file.php с CHMOD 666, что так же неудобно.
Владимир | Апр 16, 2022