Поможите сделать кеширование результата работы пхп-скрипта!

Чудо какое-то, сейчас оба парсера сработало.

zzallexx, ну а можно этот ваш код:

вот кусок кода

PHP:
if (file_exists( $cache_file ) &&  //проверяем есть ли кеш файл
    date('Y-m-d',filemtime($cache_file))== //дата изменения файла в формате 2011-10-21
    date("Y-m-d", mktime(0, 0, 0, date("m") , date("d"), date("Y")))){  // настоящая дата в формате 2011-10-21
    $f=fopen($cache_file,"rb");   
   $kurs=fread($f,filesize($cache_file)); //получаем данные их кеш файла  
   fclose($f); 
}else

заменить, чтобы парсер: проверил есть ли кеш файл, если нету то создал и записал данные, а если есть, то очистил и опять таки тупо записал в него спарсенные данные. Мне-то по сути больше ничего от него и не надо было.
 
Основной скрипт:
Код:
<?php
if(!file_exists('cache')) {
ob_start();

function getCourse($currency = array('R01235','R01239'),$shift = 0){ 
    $value = array(); 
    $td = mktime(0,0,0,date('m'),intval(date('d'))+$shift,date('Y')); 
    $ystd = mktime(0,0,0,date('m'),intval(date('d'))+$shift-1,date('Y')); 
    foreach($currency as $cur){ 
        $url = 'http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='.date('d/m/Y',$ystd).'&date_req2='.date('d/m/Y',$td).'&VAL_NM_RQ='.$cur; 
        $xml = DOMDocument::loadXML(file_get_contents($url)); 
        if(!$xml) return null; 
        $y = 
        $t = 0; 
        $nominal = 1; 
        $xpc = new DOMXPath($xml); 
        if($xpc->evaluate('count(//Record)')<2 && abs($shift)<10){ 
            return getCourse($currency,$shift-1); 
        } 
        $res = $xpc->query('/ValCurs/Record[@Date="'.date('d.m.Y',$ystd).'"]/Value/text()'); 
        if($res->length) $y = floatval(str_replace(',','.',$res->item(0)->data)); 
        $res = $xpc->query('/ValCurs/Record[@Date="'.date('d.m.Y',$td).'"]/Value/text()'); 
        if($res->length) $t = floatval(str_replace(',','.',$res->item(0)->data)); 
        $res = $xpc->query('/ValCurs/Record[@Date="'.date('d.m.Y',$td).'"]/Nominal/text()'); 
        if($res->length) $nominal = floatval(str_replace(',','.',$res->item(0)->data)); 
        $value[$cur]['date'] = $td; 
        $value[$cur]['course'] = $t; 
        $value[$cur]['nominal'] = $nominal; 
        $value[$cur]['spread'] = $t-$y; 
    } 
    return $value; 
} 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Информер курса валют - pgood.ru</title> 
<style type="text/css"> 
table{ 
font:12px Arial, Helvetica, sans-serif; 
color:#333; 
} 
table td,th{ 
padding:5px; 
text-align:left; 
} 
</style> 
</head> 
<body> 
<? 
$val = array( 
    'R01235' => 'Доллар США', 
    'R01239' => 'Евро' 
); 
$cur = getCourse(array_flip($val)); 
?> 
<table border="0" cellspacing="0" cellpadding="5"> 
    <tr> 
        <td>&nbsp;</td> 
        <th colspan="3">Курс валют на <?=date('d.m.Y',$cur['R01235']['date'])?></th> 
    </tr> 
<? 
foreach($val as $i => $cur_name){ 
    $color = $cur[$i]['spread']>=0 ? '00CC00' : 'FF0000';        //красный, если понизился, зеленый, если повысился 
    $spread = number_format($cur[$i]['spread']*100,0,',','');    //разницу в курсах переводим в копейки 
    $course = number_format($cur[$i]['course'],4,',',' ');        //текущий курс 
?> 
    <tr> 
        <td style="background:#<?=$color?>;">&nbsp;</td> 
        <th><?=$cur_name?></th> 
        <td style="color:#999;"><?=$cur[$i]['spread']>=0 ? '+' : ''?><?=$spread?> коп.</td> 
        <td><strong><?=$course?></strong> руб.</td> 
    </tr> 
<? 
} 
?> 
</table> 
</body> 
</html>

<?php
$out1 = ob_get_contents();
ob_end_clean();
echo $out1;
file_put_contents('cache', $out1);
} else {
echo file_get_contents('cache');
}
?>

Скрипт 2:
Код:
<?php
unlink('cache');
?>

Скрипт 2 поставить на крон раз в 24 часа. Он будет удалять файл с кешем.
Суть работы скрипта 1: Если нет файла с кешем, то скрипт парсит данные и записывает их в кеш (т.е. создает файл с кешем). Если файл с кешем есть - он не будет парсить данные, а просто будет показывать содержимое кеша.

Раз в 24 часа скрипт 2 просто удаляет кеш-файл, заставляя скрипт 1 спарсить данные заново.
 
Суть работы скрипта 1: Если нет файла с кешем, то скрипт парсит данные и записывает их в кеш (т.е. создает файл с кешем). Если файл с кешем есть - он не будет парсить данные, а просто будет показывать содержимое кеша.

Попробовал запустить скрипт 1 - результат, ничего не создается и не показывается.
 
заменить, чтобы парсер: проверил есть ли кеш файл, если нету то создал и записал данные, а если есть, то очистил и опять таки тупо записал в него спарсенные данные. Мне-то по сути больше ничего от него и не надо было.
но ведь он именно это и делает с наступлением нового дня при первой загрузке :)
 
но ведь он именно это и делает с наступлением нового дня при первой загрузке :)

zzallexx, я это понимаю ;). Только вот походу мы друг друга не поняли до конца.

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

Вот что мне нужно было в вашем первом варианте скрипта.
 
PHP:
<?php  
$cache_file=$_SERVER['DOCUMENT_ROOT']."/cache/kurs.txt"; //права на папку cache 777 
if (!file_exists( $cache_file )) $fp = fopen($cache_file,'w');
    $url = 'http://www.cbr.ru'; 
    $content = file_get_contents($url); 
    $content = iconv('utf-8','windows-1251',$content); 
    preg_match('/icon_dollar\.gif\".*?nowrap>(.*?)&nbsp;<img alt=\'(.*?)\'.*?nowrap>(.*?)&nbsp;<img alt=\'(.*?)\'/si',$content,$match); 
    $dollar =  $match[1]; 
    $spread = explode(' ',$match[2]); 
    $d_spread = number_format($spread[1]*100,0,',','');  
    $euro =  $match[3]; 
    $spread = explode(' ',$match[4]); 
    $e_spread = number_format($spread[1]*100,0,',',''); 
  
     $style ='<style type="text/css">  
            table{ font:12px Arial, Helvetica, sans-serif; color:#333; }  
            table td,th{ padding:5px; text-align:left; }  
            </style>';  

    $tab1='<table border="0" cellspacing="0" cellpadding="5">  
                <tr>  
                <td>&nbsp;</td>  
                    <th colspan="3">Курс валют на '.date('d.m.Y').'</th>  
                </tr>'; 
    $color = $d_spread >=0 ? '00CC00' : 'FF0000';        //красный, если понизился, зеленый, если повысился  
    if($d_spread >=0 )$plus = "+"; else $plus = ""; 
    $tab2 = '<tr>  
        <td style="background:#'.$color.'">&nbsp;</td>  
        <th>Доллар США</th>  
        <td style="color:#999;">'.$plus.$d_spread.' коп.</td>  
        <td><strong>'.$dollar.'</strong> руб.</td>  
    </tr>';  
     $color = $e_spread >=0 ? '00CC00' : 'FF0000';        //красный, если понизился, зеленый, если повысился  
    if($d_spread >=0 )$plus = "+"; else $plus = ""; 
    $tab3 = '<tr>  
        <td style="background:#'.$color.'">&nbsp;</td>  
        <th>Евро</th>  
        <td style="color:#999;">'.$plus.$e_spread.' коп.</td>  
        <td><strong>'.$euro.'</strong> руб.</td>  
    </tr></table>';  
    $kurs = $style.$tab1.$tab2.$tab3; 
    @file_put_contents($cache_file,$kurs); 
	fclose($fp);
запускай его по крону подключай
PHP:
include('$_SERVER['DOCUMENT_ROOT']."/cache/kurs.txt"');
 
запускай его по крону подключай

zzallexx, мне это:
нужно было в вашем первом варианте скрипта.

chmod надо выставить

bafoed, я скрипт на денвере запускаю, там права chmod сами знаете.
 
я тоже на денвере, у меня все работает
 
У меня тупо выдает "Удаленный сервер или файл не найден".

Ваш код я закинул в файл kurs.php в корневой папке сайта и запускаю его открывая _http://sait.ru/kurs.php
 
Назад
Сверху