Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Кэширование php скрипта

55K
02 июля 2011 года
byFahrenheit
17 / / 23.06.2010
Здравствуйте уважаемые программисты! Возник вопрос такого типа:

Есть php скрипт, который берет информацию с xml файлов, которые находятся на стороннем сервере, обрабатывает ее, и выводит пользователю.
Для каждого пользователя подгружается непосредственно относящийся к нему xml файл.
Кусок скрипта, в котором показано подключение данных файлов:


Код:
@$stats = "http://world.needforspeed.com/SpeedAPI/ws/game/nfsw/driver/".$_GET['name']."/stats";
  @$profile = "http://world.needforspeed.com/SpeedAPI/ws/game/nfsw/driver/".$_GET['name']."/profile";
  @$badges = "http://world.needforspeed.com/SpeedAPI/ws/game/nfsw/driver/".$_GET['name']."/badges";
  @$cars = "http://world.needforspeed.com/SpeedAPI/ws/game/nfsw/driver/".$_GET['name']."/cars";
  @$car = "http://world.needforspeed.com/SpeedAPI/ws/game/nfsw/driver/".$_GET['name']."/car";
   
  $xmlstats = @simplexml_load_file($stats);
  $xmlprofile = @simplexml_load_file($profile) or die(@$search_user = "Игрок с ником <strong>" .$_GET['name']. "</strong> не найден.");
  $xmlbadges = @simplexml_load_file($badges);
  $xmlcars = @simplexml_load_file($cars);
  $xmlcar = @simplexml_load_file($car);



где $_GET['name'] - это логин пользователя, например HUNTER.

Суть проблемы заключается в том, что при каждой перезагрузке страницы скрипта, он заново отсылает запрос на сервер с xml файлами, а это трата ценного времени, а так-же при отключении самого сервера, пользователь просто не получит необходимую информацию. Я пришел к выводу, что нужно кэшировать скрипт, и обновлять кэш примерно два раза в сутки. Но так как только недавно начал писать на php, еще не имею достаточно знаний дабы решить данную проблему. Поэтому прошу Вашей помощи...
14
02 июля 2011 года
Phodopus
3.3K / / 19.06.2008
нужно кешировать xml-файлы тогда уж
55K
02 июля 2011 года
byFahrenheit
17 / / 23.06.2010
Цитата: Phodopus
нужно кешировать xml-файлы тогда уж



они находятся на другом сервере.
Сори за глупый вопрос, но как тогда их кэшировать?

7
02 июля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Очевидно же!Проверяешь в локальном кэше наличие нужного XML-файла для конкретного пользователя.Если его нет–качаешь,если есть–отдаёшь его
55K
02 июля 2011 года
byFahrenheit
17 / / 23.06.2010
Цитата: @pixo $oft
Очевидно же!Проверяешь в локальном кэше наличие нужного XML-файла для конкретного пользователя.Если его нет–качаешь,если есть–отдаёшь его



я только недавно начал работать с php и пока не знаю как это реализовать

13
02 июля 2011 года
RussianSpy
3.0K / / 04.07.2006
$_GET['name'] стоит проверять прежде чем подставлять в адрес. А то вас с вашим скриптом поимеют по полной программе
55K
02 июля 2011 года
byFahrenheit
17 / / 23.06.2010
Цитата: RussianSpy
$_GET['name'] стоит проверять прежде чем подставлять в адрес. А то вас с вашим скриптом поимеют по полной программе



Вот полный код скрипта:

Код:
<?php
 
@$r = strtoupper($_GET['name']);
if ($r){
  @$stats = "http://world.needforspeed.com/SpeedAPI/ws/game/nfsw/driver/".$_GET['name']."/stats";
  @$profile = "http://world.needforspeed.com/SpeedAPI/ws/game/nfsw/driver/".$_GET['name']."/profile";
  @$badges = "http://world.needforspeed.com/SpeedAPI/ws/game/nfsw/driver/".$_GET['name']."/badges";
  @$cars = "http://world.needforspeed.com/SpeedAPI/ws/game/nfsw/driver/".$_GET['name']."/cars";
  @$car = "http://world.needforspeed.com/SpeedAPI/ws/game/nfsw/driver/".$_GET['name']."/car";
   
  $xmlstats = @simplexml_load_file($stats);
  $xmlprofile = @simplexml_load_file($profile) or die(@$search_user = "Игрок с ником <strong>" .$_GET['name']. "</strong> не найден.");
  $xmlbadges = @simplexml_load_file($badges);
  $xmlcars = @simplexml_load_file($cars);
  $xmlcar = @simplexml_load_file($car);
 
     /* Подгружаем шаблон */
     $tpl->load_template('speedapi/statsnfs.tpl');
     $tpl->set('{username}', strtoupper($_GET['name']));
     
     
/* Начало основной статистики игрока */
foreach ($xmlstats->eventStats->worldEventStats as $worldEventStats) {
  $tpl->set('{multiPlayerAverageFinishingPlace}', $worldEventStats['multiPlayerAverageFinishingPlace']); // Среднее место в гонке (Мультиплеер)
  $tpl->set('{singlePlayerAverageFinishingPlace}', $worldEventStats['singlePlayerAverageFinishingPlace']); // Среднее место в гонке (Сингл)
  $tpl->set('{averageFinishingPlace}', $worldEventStats['averageFinishingPlace']); // Среднее место в гонке (Всего)
 
  $tpl->set('{multiPlayerRaces}', $worldEventStats['multiPlayerRacesWon'] + $worldEventStats['multiPlayerRacesLost']); // Завершено гонок (Мультиплеер)
  $tpl->set('{singlePlayerRaces}', $worldEventStats['singlePlayerRacesWon'] + $worldEventStats['singlePlayerRacesLost']); // Завершено гонок (Сингл)
  $tpl->set('{totalRaces}', $worldEventStats['totalRacesWon'] + $worldEventStats['totalRacesLost']); // Завершено гонок (Всего)
 
  $tpl->set('{multiPlayerRacesWon}', $worldEventStats['multiPlayerRacesWon']); // Побед (Мультиплеер)
  $tpl->set('{singlePlayerRacesWon}', $worldEventStats['singlePlayerRacesWon']);  // Побед (Сингл)
  $tpl->set('{totalRacesWon}', $worldEventStats['totalRacesWon']); // Побед (Всего)
 
  $tpl->set('{multiPlayerRacesLost}', $worldEventStats['multiPlayerRacesLost']); // Поражений (Мультиплеер)
  $tpl->set('{singlePlayerRacesLost}', $worldEventStats['singlePlayerRacesLost']); // Поражений (Сингл)
  $tpl->set('{totalRacesLost}', $worldEventStats['totalRacesLost']); // Поражений (Всего)
 
  $tpl->set('{multiPlayerRacesProcentWon}', round((($worldEventStats['multiPlayerRacesWon']/($worldEventStats['multiPlayerRacesWon'] + $worldEventStats['multiPlayerRacesLost']))*100) * 100) / 100); // Поражений (Мультиплеер)
  $tpl->set('{singlePlayerRacesProcentLost}', round((($worldEventStats['singlePlayerRacesWon']/($worldEventStats['singlePlayerRacesWon'] + $worldEventStats['singlePlayerRacesLost']))*100) * 100) / 100); // Поражений (Сингл)
  $tpl->set('{totalRacesProcentLost}', round((($worldEventStats['totalRacesWon']/($worldEventStats['totalRacesWon'] + $worldEventStats['totalRacesLost']))*100) * 100) / 100); // Поражений (Всего)
 
  $tpl->set('{multiPlayerDnfCount}', $worldEventStats['multiPlayerDnfCount']); // DNF (Мультиплеер)
  $tpl->set('{singlePlayerDnfCount}', $worldEventStats['singlePlayerDnfCount']); // DNF (Сингл)
  }
 
 foreach ($xmlstats->streaksStats->worldStreaksStats as $worldStreaksStats) {
  $tpl->set('{bestMultiPlayerWinStreak}', $worldStreaksStats['bestMultiPlayerWinStreak']); // Серия побед (Мультиплеер)
  $tpl->set('{bestSinglePlayerWinStreak}', $worldStreaksStats['bestSinglePlayerWinStreak']); // Серия побед в гонке (Сингл)
  $tpl->set('{currentMultiPlayerWinStreak}', $worldStreaksStats['currentMultiPlayerWinStreak']); // Вал серии побед (Мультиплеер)
  $tpl->set('{currentSinglePlayerWinStreak}', $worldStreaksStats['currentSinglePlayerWinStreak']); // Вал серии в гонке (Сингл)
  }
/* Конец основной статистики игрока */  

/* Начало основной информации игрока */
foreach ($xmlstats->skillsStats->worldSkillsStats as $worldSkillsStats) {
  $tpl->set('{raceSkillPoints}', $worldSkillsStats['raceSkillPoints']); // Гоночный скил
  $tpl->set('{pursuitSkillPoints}', $worldSkillsStats['pursuitSkillPoints']); // Скил погони
  $tpl->set('{exploreSkillPoints}', $worldSkillsStats['exploreSkillPoints']); // Скил поездки
  }
 
  $tpl->set('{level}', $xmlprofile['level'][0]); // Уровень игрока
  $tpl->set('{image}', $xmlprofile['image'][0]); // Номер аватарки
  $tpl->set('{statusMessage}', iconv("UTF-8", "windows-1251", $xmlprofile['statusMessage'])); // Сообщение статуса

 
  foreach ($xmlbadges->worldBadge as $worldBadge) {
  $worldBadgename = $worldBadge['name']; // Особый статус

    if ($worldBadgename == 'VIP'){
        $nameVIP = '(VIP)';
    }elseif ($worldBadgename == 'BETA'){
        $nameBETA = '(BETA)';
    }
  }
  if ($xmlbadges->worldBadge){
            $tpl->set('{nameVIP}', $nameVIP);
            $tpl->set('{nameBETA}', $nameBETA);
       
  }else{
  $tpl->set('{nameBETA}', ' ');
  $tpl->set('{nameVIP}', ' ');
  }

/* Конец основной информации игрока */
   

/* Начало статистики автомобилей */

foreach ($xmlcars->worldCar as $worldCar) {

  $make = $worldCar['make']; // Производитель
  $carName = $worldCar['carName']; // Модель автомобиля
 
foreach ($worldCar->physicsProfile as $physicsProfile) {
  $topSpeed = $physicsProfile['topSpeed']/10; // Максимальная скорость
  $acceleration = $physicsProfile['acceleration']/10; // Ускорение
  $handling = $physicsProfile['handling']/10; // Управление
  $rating = $physicsProfile['rating']/10; // Рейтинг
  $tier = $physicsProfile['tier']; // Tier
  }
  if ($tier == '1'){
    $tier = '<img src="http://nfs-world.com/engine/modules/speedapi/img/other/t1.png" alt="tier 1">';
  }elseif ($tier == '2'){
    $tier = '<img src="http://nfs-world.com/engine/modules/speedapi/img/other/t2.png" alt="tier 2">';
  }elseif ($tier == '3'){
    $tier = '<img src="http://nfs-world.com/engine/modules/speedapi/img/other/t3.png" alt="tier 3">';
  }
 
  $carinfo .= "<tr><td class='alt2'>" .$tier. "</td><td class='alt2'>" .$make. "</td><td class='alt2'>" .$carName. "</td><td class='alt2'><div class='progress'><div class='prog' style='width:" .$topSpeed. "%'><span class='percent'>".$topSpeed."%</span></div></div></td><td class='alt2'><div class='progress'><div class='prog' style='width:" .$acceleration. "%'><span class='percent'>".$acceleration."%</span></div></div></td><td class='alt2'><div class='progress'><div class='prog' style='width:" .$handling. "%'><span class='percent'>".$handling."%</span></div></div></td><td class='alt2'><div class='progress'><div class='prog' style='width:" .$rating. "%'><span class='percent'>".$rating."%</span></div></div></td></tr>";
  $tpl->set('{carinfo}', $carinfo); // Вывод таблицы автомобилей
}

/* Конец статистики автомобилей */
  $tpl->set('{make}', $xmlcar['make'][0]); // Вывод таблицы автомобилей
  $tpl->set('{carName}', $xmlcar['carName'][0]); // Вывод таблицы автомобилей

     $tpl->set('{search_user}', $search_user);
     $tpl->compile('content');
     $tpl->clear();  
   
}else{
echo "Неправильно введен адрес" ;
}
 


?>


Помогите пожалуйста исправить мою ошибку, и прикрутить кэш. Буду премного благодарен за помощь :)
8
02 июля 2011 года
mfender
3.5K / / 15.06.2005
Цитата: byFahrenheit
Суть проблемы заключается в том, что при каждой перезагрузке страницы скрипта, он заново отсылает запрос на сервер с xml файлами, а это трата ценного времени, а так-же при отключении самого сервера, пользователь просто не получит необходимую информацию. Я пришел к выводу, что нужно кэшировать скрипт, и обновлять кэш примерно два раза в сутки. Но так как только недавно начал писать на php, еще не имею достаточно знаний дабы решить данную проблему. Поэтому прошу Вашей помощи...


Проблемы я что-то вообще не заметил. По ТЗ написано «обновлять кэш примерно два раза в сутки». Ну так и обновляй. А скрипт пущай даты хавает их твоего «кэша».

55K
02 июля 2011 года
byFahrenheit
17 / / 23.06.2010
Цитата: mfender
Проблемы я что-то вообще не заметил. По ТЗ написано «обновлять кэш примерно два раза в сутки». Ну так и обновляй. А скрипт пущай даты хавает их твоего «кэша».


аналогично, как я писал выше: "я только недавно начал работать с php и пока не знаю как это реализовать".
Код выше - это все что я написал, теперь мне нужно к нему прикрутить скрипт кэша, а как - я не знаю...

8
02 июля 2011 года
mfender
3.5K / / 15.06.2005
божэмойбожэмой!
а логику трудно прикрутить?
одним скриптом в назначенное время складываешь сторонний xml в какой-то директорий, а другим скриптом берёшь соответствующий xml из того же директория по мере надобности.

я бы вообще всё это сделал примерно так:

1. Беру в обозначенное время xml со стороннего места.
2. Разбираю его сразу и складываю либо в массив, или объект, или вообще в БД.
3. Когда нужно просто беру из своих источников ту информацию, что в них есть, совершенно не парясь, что там на стороннем серванте, ибо чётко знаю, что в назначенное время у меня там всё равно будет всё обновлено. Ну или хотя бы на телефон придёт сообщение, что с cron'ом какая-то беда.
55K
02 июля 2011 года
byFahrenheit
17 / / 23.06.2010
Цитата: mfender
божэмойбожэмой!
а логику трудно прикрутить?
одним скриптом в назначенное время складываешь сторонний xml в какой-то директорий, а другим скриптом берёшь соответствующий xml из того же директория по мере надобности.

я бы вообще всё это сделал примерно так:

1. Беру в обозначенное время xml со стороннего места.
2. Разбираю его сразу и складываю либо в массив, или объект, или вообще в БД.
3. Когда нужно просто беру из своих источников ту информацию, что в них есть, совершенно не парясь, что там на стороннем серванте, ибо чётко знаю, что в назначенное время у меня там всё равно будет всё обновлено. Ну или хотя бы на телефон придёт сообщение, что с cron'ом какая-то беда.



я не знаю как написать сам скрипт, который выполнит вышеуказанные действия

8
02 июля 2011 года
mfender
3.5K / / 15.06.2005
чёрт, ну так развивайся. я бы написал сейчас за пол-часа довольно стройную конструкцию даже без привязки к месту (абстрагированно), но у меня жена, дети, работа, вобщем есть иные радости в жизни.

ну подумай головой. не глумись над людьми. там всё просто. почитай буквы в Сети, в конце-концов, там всё написано.
55K
02 июля 2011 года
byFahrenheit
17 / / 23.06.2010
Цитата: mfender
чёрт, ну так развивайся. я бы написал сейчас за пол-часа довольно стройную конструкцию даже без привязки к месту (абстрагированно), но у меня жена, дети, работа, вобщем есть иные радости в жизни.

ну подумай головой. не глумись над людьми. там всё просто. почитай буквы в Сети, в конце-концов, там всё написано.



да читаю. Просто ничего толкового не нашел. Мне бы небольшой пример, как например кэшировать вот такой скрипт http://nomagic.ru/article.php?aid=24 а дальше я сам.
Я понимаю что для Вас это просто и понятно, но я только начинаю изучать php, и для меня не все ясно. Прошу прощения, если уже достал, но без Вашей помощи - никак....

13
02 июля 2011 года
RussianSpy
3.0K / / 04.07.2006
Зачем пример? Есть документация - ищите нужные функции. Нужно сохранить файл? Ищите функции для работы с файлами. php.net
Идею в общих чертах вам описали - вам нужно лишь собрать ее в виде кода. Ну или как вариант можете заплатить тому кто разбирается, чтобы он в законный выходной, в летний солнечный день делал за вас вашу работу, сидя за компьютером
369
02 июля 2011 года
Kesano
451 / / 09.10.2007
Ну так, чисто абстракцией:

Делаем базу имен с полями id, name, lastupdate

Код:
if($_GET["name"])
{
   $name= checkname($_GET["name"]); // Тут проверим name на правильность. Функцию сам напишешь

   if($name!='') { // Например, если имя в функции не уодвлетворяет требованиям, то просто возвращаешь из функции пустое значение

   $result=mysql_query("select * from table_names where name='$name' limit 1");
   if($arr=mysql_fetch_assoc($result)) {
       $time=time() - 86400; // Вычисляем актуальность... например сутки
       if($arr["lastupdate"]<$time) {
           $newxml=file_get_contents("http://world.needforspeed.com/SpeedAPI/ws/game/nfsw/driver/".$_GET['name']."/car");
           $file=fopen("/xmls/".$name.".car.xml", "w+");  //Создали открыли пометили как car
           fputs($newxml, $file); // Записали
           fclose($file); // закрыли
           mysql_query("update table_names set lastupdate='".time()."' where name='$name'");
       }
      // Ну и ясное дело туда записываешь все виды xmlей..

     $xmlcar = @simplexml_load_file("xmls/".$name.".car.xml");
   }
   }
}


Должно работать...
244
03 июля 2011 года
UAS
2.0K / / 19.07.2006
Да можно и без базы данных. Она незачем.
Допустим, каждый файл уникальное имя имеет. И у каждого файла есть свойство "последнее обновление" или типа того. Вот и всё. Просто пробегаетесь по файлам, смотрите как давно он обновлялся. При необходимости - обновляете его новыми данными.
55K
04 июля 2011 года
byFahrenheit
17 / / 23.06.2010
Походу разобрался. Но работает только тогда, когда информация выводится в самом скрипте, а в моем случае - она отправляется в шаблон tpl и там уже выводится.
За основу брал этот скрипт http://spectator.ru/entry/1832
74K
10 июля 2011 года
Izya
1 / / 10.07.2011
Цитата:
И у каждого файла есть свойство "последнее обновление" или типа того.



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

244
10 июля 2011 года
UAS
2.0K / / 19.07.2006
Цитата:
хорошо, но есть свои недостатки. время модификации файла легко изменить, тем-же touch'ем, файл можно легко затереть, если файлов в папке очень много - будет тормозить.


Это уже проблема программиста, а не метода.
Если любой может спокойно вызвать touch на файл, то это уже проблема защиты. Да и кол-во файлов для появления тормозов - дело спорное. Вряд ли у ТС будет в кэше хотя бы 200 файлов.

55K
19 июля 2011 года
byFahrenheit
17 / / 23.06.2010
Сделал по Вашему способу. Работает отлично, но почитав Ваши сообщения, возник вопрос:
1. "touch'ем, файл можно легко затереть" - каким образом? В принципе даже если файл удалят, то ничего страшного не будет, скрипт просто загрузит его заново.
2. "Вряд ли у ТС будет в кэше хотя бы 200 файлов." - На самом деле файлов будет намного больше 200. Как вариант - сделать авто очистку папки каждых 12 часов. Как Вы считаете, этого достаточно?

Еще такой вопрос: Написал скрипт, который на баннере рисует статистику игрока. Каждый игрок свой баннер будет использовать на разных форумах. Получается что при каждом открытии страницы форума, будет обрабатываться скрипт у меня на сервере. Как Вы считаете, стоит ли кэшировать изображения, или нет разницы, загружается ли просто картинка, или обрабатывается скрипт?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог