2015-01-19 3 views
2

Я написал сценарий PHP для анализа RSS-канала и попытаюсь получить открытые графические изображения из метатег og: image.Быстрый и эффективный способ извлечения конечного URL-адреса статьи

Для получения изображений мне нужно проверить, являются ли URL-адреса в RSS-канале 301 переадресацией. Это часто происходит, и это означает, что мне нужно следовать любым переадресациям к результирующим URL-адресам. Это означает, что скрипт работает очень медленно. Есть ли более быстрый и эффективный способ достижения этого?

Вот функция для получения окончательного URL:

function curl_get_contents($url) { 
$agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)'; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
$result=curl_exec($ch); 
return $result; 
} 

И это функция для получения О.Г. изображения (если они существуют):

function getog($url) { 
    $doc = new DomDocument(); 
    $doc->loadHTML(curl_get_contents($url)); 
    if($doc == "") {return;} 
    $xpath = new DOMXPath($doc); 
    $query = '//*/meta[starts-with(@property, \'og:\')]'; 
    $queryT = ''; 
    $metas = $xpath->query($query); 
    foreach ($metas as $meta) { 
     $property = $meta->getAttribute('property'); 
     $content = $meta->getAttribute('content'); 
     if($property == "og:url" && $ogProperty['url'] == "")  {$ogProperty['url'] = $content;} 
     if($property == "og:title" && $ogProperty['title'] == "") {$ogProperty['title'] = $content;} 
     if($property == "og:image" && $ogProperty['image'] == "") {$ogProperty['image'] = $content;} 
    } 
    return $ogProperty; 
} 

Существует довольно немного больше к сценарию, но эти функции - шея бутылки. Я также кэширую текстовый файл, что означает, что он быстрее после первого запуска.

Как я могу ускорить мой скрипт, чтобы получить окончательный URL-адрес и получить URL-адреса изображений из ссылок в RSS-фиде?

+2

Невозможно ускорить последующие переадресации. Клиент должен сделать новый запрос, и это занимает время, которое требуется. С 'CURLOPT_FOLLOWLOCATION' cURL делает это автоматически уже, поэтому нет смысла, чтобы вы могли вставлять что-нибудь быстрее. – CBroe

ответ

10

Вы можете использовать API OGG для Facebook. Facebook использует его для удаления важной информации с любого URL-адреса. Это довольно быстро по сравнению с обычным методом скремблирования.

Вы можете работать это так ..

og_scrapping.PHP:

function meta_scrap($url){ 
     $link = 'https://graph.facebook.com/?id='.$url.'&scrape=true&method=post'; 
     $ch = curl_get_contents($link); 
     return json_decode($ch); 
    } 

Тогда просто называют его где-нибудь после того, как в том числе og_scrapping.php print_r(meta_scrap('http://www.example.com'); вы получите массив, а затем вы можете получить выборочное содержание в соответствии с вашими потребностями.

Для заголовка, изображения, URL и описание вы можете получить их с помощью:

$title = $output->title; 
$image = $output->image[0]->url; 
$description = $output->description; 
$url = $output->url; 

Основная проблема возникает во время слома для изображений. Получить название и описание легко. Прочтите статью this, чтобы получить изображения быстрее. Также this поможет вам сэкономить несколько секунд.

2

Боюсь, что вы не можете сделать так, чтобы ускорить процесс извлечения. Одним из возможных улучшений было бы приближение к извлечению изображения по строкам, то есть, как правило, настоятельно рекомендуется - фокусировка на тегах og: с использованием регулярных выражений.

Это имеет главным недостаток ломки легко, если изменение источника когда-либо сделал, и не имея значительное преимущество скорости над DOM синтаксического подхода более стабильной.


Я также кэширование в текстовый файл, а значит, быстрее после первого запуска.

С другой стороны, вы могли бы пойти с подходом, который всегда служит только кэш для пользователя, и обновляет его с помощью асинхронного вызова, если это необходимо по каждому запросу.

Как CBroe прокомментировал ваш ответ:

Там нет никакого способа ускорить следующие переадресовывает. Клиент должен сделать новый запрос, и это занимает время, которое требуется. С CURLOPT_FOLLOWLOCATION cURL делает это автоматически уже, поэтому нет смысла, когда вы могли бы вставлять что-нибудь быстрее.

Это означает, что не тяжелой задачей на вашем веб-сервере, но вместо длинный один из многочисленных запросов которые он должен выполнять.Это очень хорошая почва, чтобы начать думать асинхронной:

  1. вы получите запрос, который ищет для RSS элементов,
  2. вы служите ответ очень быстро из кэша,
  3. вы отправьте асинхронный запрос на восстановление кэша, если это необходимо - это самая длинная часть из-за перенаправления и разбора DOM, но первоначальный клиент/одноранговый узел, запрашивающий список элементов RSS, не должен ждать завершения этой операции; то есть для этого списка требуется только время, чтобы отправить запрос на перестройку, через несколько микросекунд,
  4. вы возвращаетесь с кешированными элементами.

Asynchronous shell exec in PHP

Если вы хотите идти по этому пути, в вашем случае, вы бы встретить следующие преимущества:

  • быстрое содержание служащих с высокой нагрузкой speed,
  • Отсутствие снижения скорости загрузки при восстановлении кеша.

Но также, что следующие недостатки:

  • первый пользователь запрашивает обновленный канал не немедленно * получить новейший товар (ов),
  • последующие пользователи после сначала не нужно немедленно * получать новейшие элементы, пока кеш не будет готов.

* Хорошие новости, вы можете почти отлично устранить все недостатки использование циклического, приуроченная запрос AJAX, который проверяет, есть ли какие-либо новые элементы в кэше RSS пунктов.

Если есть, вы можете отображать сообщение сверху (или внизу), информируя пользователя о прибытии нового контента и добавляя этот контент, когда пользователь нажимает на уведомление.

Этого подход - по сравнению с просто всегда кэшированным содержанием без циклического вызова AJAX - уменьшает задержку между живым внешним видом RSS и внешним видом товара на вашем сайте до максимального времени n + m, где n является интервал AJAX-запрос, и m - это время, необходимое для восстановления кеша.

1

Мета хранятся в элементе «голова».

В вашем Xpath, вы должны рассмотреть главный элемент:

$query = '//head/meta[starts-with(@property, \'og:\')]'; 

Вы теряете некоторое время извлечения, хранения и разбора весь HTML-файл, когда вы можете остановить извлечение после окончания элемента «голова» , Кроме того, почему получение 40k веб-страницы, когда вы хотите только 1k?

Вы «можете» рассмотреть возможность остановки поиска после того, как вы отделили конечный элемент «голова». Это может ускорить работу, когда нет другого дела, но это непослушный, но не всегда рабочий взлом.

Смежные вопросы