Офис НП 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 Добавлено  11-07-2015 09:05 11 Июль 2015 09:05:39 3652  Прочтений 3652 Прочтений  1 Комментарий 1 Комментарий
 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}}]}




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

Удачи в парсинге и всех благ!
Понравилась статья?
Метки для данной статьи
Похожие статьи
Поделиться:   
Комментарии
#1 | Ильдар Хакимов 07 сентября 2019 11:12:27
No Avatar
Гость
Спасибо, работает, только:

1. В примере youtube ошибка в первой строке - $cache вместо $ycache
2. Папку cache нужно создать заранее.
Добавить комментарий
Имя:

Проверочный код:
Последние активные темы форума
  Темы Просмотров Ответов Последние сообщения
folder Плагин Email рассылки Mail To All by Pisatel
CMS PHP Fusion
13631 33 promask
27. апреля 2019
folder Вопрос по переделке bb-кода
PHP, MySQL
3442 5 Pisatel
26. мая 2017
folder Вопросы по Ajax форме обратной связи
CMS PHP Fusion
14488 48 Ditrin
19. февраля 2017
folder BBCode YouTube Video Colorbox mod
CMS PHP Fusion
7909 2 Pisatel
10. декабря 2016
folder Как лучше создать собственную страницу?
CMS PHP Fusion
7480 17 Pisatel
11. мая 2016
folder Небольшие вопросы по скриптам магазина и катало...
PHP, MySQL
54107 80 Pisatel
11. января 2016
folder BBCode Code mod
CMS PHP Fusion
4162 0 Pisatel
31. августа 2015
folder Ajax Like Dislike Article Panel
CMS PHP Fusion
8310 16 Pisatel
07. июля 2015
folder Хлебные крошки / BreadCrumbs SEO Panel
CMS PHP Fusion
9568 17 Pisatel
04. июля 2015
folder Abbr Description BBCode
CMS PHP Fusion
3143 0 Pisatel
15. июня 2015
folder Подозрительный трафик и прочие страшилки
Всякая хрень
6226 2 Ditrin
23. апреля 2015
folder Мод Newsletter - рассылка писем пользователям с...
CMS PHP Fusion
7995 13 Pisatel
10. апреля 2015
folder Мод отправки писем PHPMailer для PHP-Fusion
CMS PHP Fusion
42690 113 Ditrin
06. апреля 2015
folder Появление неизвестного файла subscriptions.php
CMS PHP Fusion
3810 2 Pisatel
06. апреля 2015
folder Autoban on IP
CMS PHP Fusion
14009 13 Pisatel
03. апреля 2015