Медленный парсинг XML средствами PHP. Как увеличить скорость?

Есть задача парсить xml файлы с видео-хостинга vimeo. Скрипт реализации:
<?php
function vimeo_parse($video_id) {
	$url = "http://vimeo.com/api/v2/video/".$video_id.".xml";
	$xml = simplexml_load_file($url);

	$vimeo_title = $xml->video->title;
	$vimeo_thumb = $xml->video->thumbnail_large;

	return array($vimeo_title,$vimeo_thumb,$video_id);
}

// пример использования
// list ($vimeo_title,$vimeo_thumb,$vimeo_id) = vimeo_parse("27973852");
// echo $vimeo_title;
// echo $vimeo_thumb;
// echo $vimeo_id;
?>


На странице нужно вывести порядка 20-ти видео. Каждый парсинг выполняется примерно 0.4 секунды, а это 20*0.4 = 8 секунд парсинга (+загрузка самой страницы), что совершенно не хорошо. Каким способом можно избежать такой долгой работы скрипта?
  • Вопрос задан
  • 3517 просмотров
Решения вопроса 2
pi314
@pi314
Президент Солнечной системы и окрестностей
LIBXML_COMPACT ?
А, вообще, проблема, похоже, архитектурного плана. Если файлы небольшие, то время, в основном, расходуется на выкачивание по HTTP. Выкачайте 20 файлов, положите на диск и сравните производительность. Если подтвердится, поможет только какое-нибудь умное предварительное кеширование.
Ответ написан
TARAKANhoy
@TARAKANhoy Автор вопроса
Переписал скрипт с кэширование данных, теперь всё летает:
<?php
function vimeo_parse($video_id) {
	$fp = fopen($video_id.'.txt', 'r+');
	if (!$fp) {
		$fp = fopen($video_id.'.txt', 'w+');

		$url = "http://vimeo.com/api/v2/video/".$video_id.".xml";
		$xml = simplexml_load_file($url);

		$vimeo_title = $xml->video->title;
		$vimeo_thumb = $xml->video->thumbnail_large;

		$text_write = $vimeo_title."\n".$vimeo_thumb."\n".$video_id;
		fwrite($fp, $text_write);
		fclose($fp);
		return array($vimeo_title,$vimeo_thumb,$video_id);
	}
	else {
		$stack = array();
		while(!feof($fp)) { 
			array_push($stack,fgets($fp));
		}
		fclose($fp);
		return $stack;
	}
}

// пример использования
// list ($vimeo_title,$vimeo_thumb,$vimeo_id) = vimeo_parse("27973852");
// echo $vimeo_title;
// echo $vimeo_thumb;
// echo $vimeo_id;
?>
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Alexufo
@Alexufo
противоречивый, сложный, весь компьютерный.
Вы сервер опрашиваете, и почему должно быть быстрее? Кешируйте результаты опроса, грузите асинхронно через js на клиенте.
Ответ написан
Комментировать
sanchezzzhak
@sanchezzzhak
Ля ля ля...
Создавайте фоновый скрипт, который будет перекачивать к вам данные.
Для больших XML 10мб-2гб используйте XmlReader для обхода нод, для чтения ноды SimpelXMl.

Опрашивать сервер постоянно это не выход, рано или позно он не сможет отдать вам XML вы покажете посетителю не то, что он хотел увидить и он уйдет сайта
Ответ написан
Комментировать
rdifb0
@rdifb0
Программист, реалист
Вам нужно получить данные, которые особо не будут изменятся. Почему не спарсить все заранее, откуда берутся video_id ?
Все время уходит на HTTP стопудово.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы