Несколько RSS-каналов с PHP (производительность) - PullRequest
1 голос
/ 13 августа 2010

В моем недавнем проекте я работаю с несколькими RSS-фидами. Я хочу перечислить только последние сообщения из всех них и отсортировать их по временным меткам.

Моя проблема в том, что у меня около 20 различных фидов, и странице требуется 6 секунд для загрузки (только тестирование с 10 фидами).

Что я могу сделать, чтобы сделать это лучше ?

Я использую simplexml:

simplexml_load_file($url);

Который я добавляю в массив:

function appendToArray($key, $value){
$this->array[$key] = $value;
}

Как раз перед тем, как показать это, я делаю krsort:

krsort($this->array);

Должен ли я как-то его кешировать?

Ответы [ 4 ]

2 голосов
/ 13 августа 2010

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

У вас может быть PHP-скрипт, который запускается в фоновом режиме (например, через задание cron) и периодически загружает каналы, на которые вы подписаны, в базу данных, тогда вы можете гораздо быстрее извлекать / фильтровать данные, когда вы хотите показать его.

0 голосов
/ 13 августа 2010

да, конечно, единственное разумное решение - кэширование.
Лучше настроить задание cron для получения этих каналов и локального хранения данных.

0 голосов
/ 13 августа 2010

Вы можете загружать RSS-каналы параллельно с curl_multi .Это может ускорить ваш сценарий, особенно если вы используете блокировку вызовов в данный момент.

Небольшой пример (из http://www.rustyrazorblade.com/2008/02/curl_multi_exec/):

$nodes = array('http://www.google.com', 'http://www.microsoft.com', 'http://www.rustyrazorblade.com');
$node_count = count($nodes);

$curl_arr = array();
$master = curl_multi_init();

for($i = 0; $i < $node_count; $i++)
{
    $url =$nodes[$i];
    $curl_arr[$i] = curl_init($url);
    curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($master, $curl_arr[$i]);
}

do {
    curl_multi_exec($master,$running);
} while($running > 0);

echo "results: ";
for($i = 0; $i < $node_count; $i++)
{
    $results = curl_multi_getcontent  ( $curl_arr[$i]  );
    echo( $i . "\n" . $results . "\n");
}
echo 'done';

Дополнительная информация может бытьнайдено в Асинхронные / параллельные HTTP-запросы с использованием PHP multi_curl и Как использовать curl_multi () без блокировки (среди прочих).

BTW Для обработки каналов послезагруженный с помощью curl_multi, вы, конечно, должны будете использовать simplexml_load_string вместо simplexml_load_file.

0 голосов
/ 13 августа 2010

Вы делали какую-либо отладку?Регистрация microtime в различных точках вашего кода.

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

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

...