Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

  • Закрытая тема Тема закрыта

И снова кеширование

#11 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143
0

Отправлено 17 Февраль 2011 - 23:22

Пожалуйста :mellow:
С порядком там как записывается, в таком порядке и выводится... во всяком случае, так должно быть.
Возвращаемые значения, которые будут записаны:
return $cy. '||' .$pr. '||' .$yav;

Выводим их:
$result[0], $result[1], $result[2]

Ну да, в принципе, не суть важно :)
  • 0


#12 Kismedia

Kismedia
    Topic Starter
  • Пользователь
  • 315 сообщений
  • Репутация: 0

Отправлено 17 Февраль 2011 - 23:25

Ну да, в принципе, не суть важно


Конечно, это уже мелочи :mellow:
  • 0

#13 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 17 Февраль 2011 - 23:48

Kismedia,
<?php

// функция обратного вызова для парсинга файла (если нужна);
function PrCyParser($content)
{
$tmp = "";
$match = array();

if( preg_match("#<cy>(.+)</cy>#", $content, $match) )
$tmp .= "Яндекс тИЦ: ".$match[1]."\r\n";
if( preg_match("#<pr>(.+)</pr>#", $content, $match) )
$tmp .= "PR: ".$match[1]."\r\n";
if( preg_match("#<yav>(.+)</yav>#", $content, $match) )
$tmp .= "Яндекс Выдача: ".$match[1]."\r\n";

return $tmp;
}

//функция обновления кеша
function updateCacheFile($file, $url, $cache_time=3600, $function_parser="")
{
clearstatcache(); // очищаем кеш файловой системы
$last_time = time() - filemtime($file); // вычисляем сколько прошло с последнего обновления (в секундах)

// если кеш устарел или файла с кешем не существует
if( $last_time > $cache_time || !file_exists($file) )
{
if( ($fp = fopen($file,'w')) !== false )
{
if( ($content = file_get_contents($url)) !== false )
{
// если нужно обработать полученный контент функцией обратного вызова
if( !empty($function_parser) )
$content = $function_parser($content);
fwrite($fp, $content);
}
fclose($fp);
}
return true;
} else {
return false;
}
}

$data = array();

if( updateCacheFile("cache.txt","http://pr-cy.ru/updates.xml",20,"PrCyParser") ) // каждые 20 секунд
echo "Кеш обновлен";
$data = file("cache.txt");


echo "<pre>";
print_r($data);
echo "</pre>";
?>


А вот мой вариантик :mellow: На все случаи жизни подойдет. Можно не только получать кеш, но и обработать перед записью.
Затем считываем из файла любым способом :)
  • 0

#14 Kismedia

Kismedia
    Topic Starter
  • Пользователь
  • 315 сообщений
  • Репутация: 0

Отправлено 18 Февраль 2011 - 00:05

ZiTosS, Это пример скрипта который проверяет время записи файла с помощью функции filemtime?
То есть наш скрипт можно сократить в размере, количестве строк?
  • 0

#15 Kismedia

Kismedia
    Topic Starter
  • Пользователь
  • 315 сообщений
  • Репутация: 0

Отправлено 18 Февраль 2011 - 00:20

Да спасибо, тоже работает. :mellow:

Вот эту часть кода удалил теперь за ненадобностью:

$stat = stat($file); // массив с информацией о файле

$stat = date("Y-m-d-G-i", $stat[9]); // дата изменения файла в формате: год-месяц-день-часы-минуты
$now = date("Y-m-d-G-i"); // текущая дата

$old = explode('-', $stat);
$new = explode('-', $now);

$time_old = mktime($old[3], $old[4], 0, $old[1], $old[2], $old[0]); // получаем метку времени даты изменения файла
$time_new = mktime($new[3], $new[4], 0, $new[1], $new[2], $new[0]); // получаем метку времени текущей даты

$dif = ($time_new - $time_old)/3600; // разница в часах


Наш скрипт теперь выглядит так:

<?php
$file = 'cache.txt'; // куда записываем
$cache_time=3600;
/*---------------
функция парсинга начало
----------------*/

function parser(){
if($xml_content = @file_get_contents("http://www.pr-cy.ru/updates.xml")){
$xml = new SimpleXMLElement($xml_content);

$cy = $xml->cy;
$pr = $xml->pr;
$yav = $xml->yav;
return $cy. '||' .$pr. '||' .$yav; // возвращаем данные в формате: 30.12.2010||21.01.2011||16.02.2011
}
}
/*---------------
функция парсинга конец
----------------*/

clearstatcache();
$last_time = time() - filemtime($file);
if( $last_time > $cache_time )
{
// если разница между последним изменением файла и текущей датой больше 12 часов - парсим и записываем в файл результат
$res = parser();

$handle = fopen($file, 'w');
if (fwrite($handle, $res) === FALSE) {
echo "Не могу произвести запись!";
exit;
}
echo "Записано!";
fclose($handle);
}// читаем файл и выводим его содержимое
$handle = fopen($file, 'r');
$content = fgets($handle);
$result = explode('||',$content);
echo 'Это первое значение: ' .$result[0]. '<br />Это второе значение: ' .$result[1]. '<br />Это третье значение: ' .$result[2];
?>


Сколько оказывается в PHP есть интересных функций, filemtime -- время последнего изменения файла

Буду знать. :)
  • 0

#16 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 18 Февраль 2011 - 00:49

Там в функции косячек у меня. Если файла не будет существовать... filemtime($file) выдаст нотайс скорее всего....
  • 0

#17 Kismedia

Kismedia
    Topic Starter
  • Пользователь
  • 315 сообщений
  • Репутация: 0

Отправлено 18 Февраль 2011 - 00:55

Ну я правильно сделал последний вариант с использованием уже filemtime?

Вроде все работает, записывает, читает. :)


  • 0

#18 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 18 Февраль 2011 - 10:16

ZiTosS, не знал о ф-ции filemtime();... спасибо :mellow:
Всегда получал данные о файле при помощи stat();... вот за это мне и нравится PHP, что одну и ту же задачу можно решить как минимум двумя способами, а зачастую таких способов гораздо больше.
  • 0


#19 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 18 Февраль 2011 - 22:29

Kismedia, вариант может и рабочий, но не понимаю, чем тебя не устраивает функция вызова в одну строку. Моей функцией можно сделать тоже самое, что у тебя есть сейчас:
<?php

// функция обратного вызова для парсинга файла (если нужна);
function PrCyParser_kismedia($content)
{
$date_updates = array();
$match = array();

if( preg_match("#<cy>(.+)</cy>#", $content, $match) )
$date_updates[] = $match[1];
if( preg_match("#<pr>(.+)</pr>#", $content, $match) )
$date_updates[] = $match[1];
if( preg_match("#<yav>(.+)</yav>#", $content, $match) )
$date_updates[] = $match[1];

return implode("||", $date_updates);
}

//функция обновления кеша
function updateCacheFile($file, $url, $cache_time=3600, $function_parser="")
{
$last_time = 0;
clearstatcache(); // очищаем кеш файловой системы

if( file_exists($file) )
$last_time = time() - filemtime($file); // вычисляем сколько прошло с последнего обновления (в секундах)

// если кеш устарел или файла с кешем не существует
if( $last_time > $cache_time || !file_exists($file) )
{
if( ($fp = fopen($file,'w')) !== false )
{
if( ($content = file_get_contents($url)) !== false )
{
// если нужно обработать полученный контент функцией обратного вызова
if( !empty($function_parser) )
$content = $function_parser($content);
fwrite($fp, $content);
}
fclose($fp);
}
return true;
} else {
return false;
}
}

$data = array();

if( updateCacheFile("cache.txt","http://pr-cy.ru/updates.xml",3600,"PrCyParser_kismedia") ) // каждый час
echo "Кеш обновлен";
$data = file("cache.txt");


echo "<pre>";
print_r($data);
echo "</pre>";
?>

Как видишь, я только изменил функцию парсинга - PrCyParser() заменил на PrCyParser_kismedia()
  • 0

#20 donriga

donriga
  • Пользователь
  • 14 сообщений
  • Репутация: 0

Отправлено 02 Март 2011 - 13:33

serialize unserialize кеширование самое простое и достаточно быстрое :)
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru