Офис НП AMWAY в Ярославле
Купить продукцию Амвей в Ярославле
На карте Купить AMWAY в ЯрославлеПриобрести высококачественную продукцию Амвей в Ярославле, получить консультации по бизнесу, заказать продукцию или получить заказ:
Адрес: улица Валентины Терешковой, дом 1 (Вход со двора)
Телефон: +7 (920) 112-00-91
Email: matyxho@mail.ru
Сайт: https://www.amway.ru/user/lebedem
Визитка: http://yar.meweb.ru
Иерархия статей
Статьи » Программирование » PHP: Функция парсинга и кэширования файлов
Сниппет
Небольшая PHP-функция для парсинга данных с другого сервера с сохранением (кэшированием)
PHP: Функция парсинга и кэширования файлов
Опубликовал  Pisatel Pisatel Добавлено  11-07-2015 09:05 11 Июль 2015 09:05:39 6870  Прочтений 6870 Прочтений
 printer
В одной из предыдущих статей "Вывод информации о видео с сервиса YouTube" я уже давал представление, как использовать Curl для парсинга файлов с другого сервера, сейчас же хочу лишь немного развить тему. Ниже представлена функция, при использовании которой мы не просто будем парсить файлы, но и сохранять их содержимое у себя на сервере (кэш), дабы уменьшить нагрузку.

Код: PHP
    function cachedCurl($url, $expires, $ycname, $ua = FALSE) {

$filename = dirname(__FILE__).DIRECTORY_SEPARATOR."cache".DIRECTORY_SEPARATOR.$ycname.".cache";

$changed = file_exists($filename) ? filemtime($filename) : 0;

$diff = time() - $changed;

if (!$changed || ($diff > $expires)) {

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);

if ($ua) {

curl_setopt($ch, CURLOPT_USERAGENT, $ua);

}

$rawData = curl_exec($ch);

curl_close($ch);

if (!$rawData) {

if ($changed) {

$cache = unserialize(file_get_contents($filename));

return $cache;

} else {

return FALSE;

}

}

$cache = fopen($filename, "wb");

if (is_writable($filename)) {

$write = fwrite($cache, serialize($rawData));

fclose($cache);

return $rawData;

} else {

fclose($cache);

return FALSE;

}

}

$cache = unserialize(file_get_contents($filename));

return $cache;

}




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

В чем же преимущества:
  • Файл сохраняется к нам на сервер, нет необходимости каждый раз делать запросы на сторонний сервер
  • Curl в 2-4 раза быстрее file_get_contents
  • Есть возможность подменить User–Agent
Данную функцию можно использовать, например, для парсинга данных с API ВКонтакте или все с того же сервиса YouTube. Ниже — пара примеров использования. Для подстановки User–Agent'а будем использовать следующий массив (не обязательно):

Код: PHP
    $ua = array(

"yandex" => "Mozilla/5.0 (compatible: YandexBot/3.0; +http://yandex.com/bots)",

"mail" => "Mozilla/5.0(compatible: Mail.RU/2.0)",

"google" => "Mozilla/5.0(compatible: Googlebot/2.1; +http://www.google.com/bot.html)",

"bing" => "Mozilla/5.0 (compatible: bingbot/2.0; +http://www.bing.com/bingbot.htm)",

"yahoo" => "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)",

"wow" => "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0"

);




Видео с ютьюб:

Код: PHP
    $cache = 600; // время обновления (перезаписи) кэш-файлов в секундах

$key = "XXXXXX"; // ваш персональный ключ api

$id = "ID_VIDEO"; //идентификатор видео

$api = "https://www.googleapis.com/youtube/v3/videos?id=".$id."&part=snippet%2Cstatistics%2CcontentDetails&key=".$key; // адрес

$youtube = json_decode(cachedCurl($api, $ycache, $id, $ua['yandex'])); // вернет необходимую информацию, сохранив ее в файл, типа такого /cache/Ltm9_f5tjc.cache

// user-agent в данном примере от яндекс, но не рекомендую, это лишь для ознакомления




Ну и еще один небольшой пример с vk.com

Код: PHP
    $cache = 60; // время обновления (перезаписи) кэш-файлов в секундах

$id = "XXXXXX"; // id пользователя

$api = "http://api.vk.com/method/users.get?uids=".$id."&fields=online%2Clast_seen"; // адрес

$vk = json_decode(cachedCurl($api, $cache, $id, $ua['wow'])); // вернет имя, статус онлайн, время визита, устройство. Что-то типа

// {"response":[{"uid":65333,"first_name":"Катюха","last_name":"Королёва","online":0,"last_seen":{"time":1436518098,"platform":4}}]}




Оговорюсь сразу, что последний параметр в функции — не обязательный (у меня прекрасно работает без подстановки "левого" агента).

Удачи в парсинге и всех благ!
Понравилась статья?
Метки для данной статьи
Похожие статьи
Поделиться:   
Последние активные темы форума
  Темы Просмотров Ответов Последние сообщения
folder Вопрос по переделке bb-кода
PHP, MySQL
22808 5 Pisatel
26. мая 2017
folder Вопросы по Ajax форме обратной связи
CMS PHP Fusion
71490 48 Ditrin
19. февраля 2017
folder BBCode YouTube Video Colorbox mod
CMS PHP Fusion
15691 2 Pisatel
10. декабря 2016
folder Как лучше создать собственную страницу?
CMS PHP Fusion
18346 17 Pisatel
11. мая 2016
folder Небольшие вопросы по скриптам магазина и катало...
PHP, MySQL
149760 80 Pisatel
11. января 2016
folder BBCode Code mod
CMS PHP Fusion
14840 0 Pisatel
31. августа 2015
folder Ajax Like Dislike Article Panel
CMS PHP Fusion
23144 16 Pisatel
07. июля 2015
folder Хлебные крошки / BreadCrumbs SEO Panel
CMS PHP Fusion
26929 17 Pisatel
04. июля 2015
folder Abbr Description BBCode
CMS PHP Fusion
7815 0 Pisatel
15. июня 2015
folder Плагин Email рассылки Mail To All by Pisatel
CMS PHP Fusion
38045 32 Pisatel
26. апреля 2015
folder Подозрительный трафик и прочие страшилки
Всякая хрень
12004 2 Ditrin
23. апреля 2015
folder Мод Newsletter - рассылка писем пользователям с...
CMS PHP Fusion
31435 13 Pisatel
10. апреля 2015
folder Мод отправки писем PHPMailer для PHP-Fusion
CMS PHP Fusion
133045 113 Ditrin
06. апреля 2015
folder Появление неизвестного файла subscriptions.php
CMS PHP Fusion
8987 2 Pisatel
06. апреля 2015
folder Autoban on IP
CMS PHP Fusion
23485 13 Pisatel
03. апреля 2015