Кэширование php скрипта
Есть php скрипт, который берет информацию с xml файлов, которые находятся на стороннем сервере, обрабатывает ее, и выводит пользователю.
Для каждого пользователя подгружается непосредственно относящийся к нему xml файл.
Кусок скрипта, в котором показано подключение данных файлов:
@$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, еще не имею достаточно знаний дабы решить данную проблему. Поэтому прошу Вашей помощи...
они находятся на другом сервере.
Сори за глупый вопрос, но как тогда их кэшировать?
я только недавно начал работать с 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 "Неправильно введен адрес" ;
}
?>
Помогите пожалуйста исправить мою ошибку, и прикрутить кэш. Буду премного благодарен за помощь :)
Проблемы я что-то вообще не заметил. По ТЗ написано «обновлять кэш примерно два раза в сутки». Ну так и обновляй. А скрипт пущай даты хавает их твоего «кэша».
аналогично, как я писал выше: "я только недавно начал работать с php и пока не знаю как это реализовать".
Код выше - это все что я написал, теперь мне нужно к нему прикрутить скрипт кэша, а как - я не знаю...
а логику трудно прикрутить?
одним скриптом в назначенное время складываешь сторонний xml в какой-то директорий, а другим скриптом берёшь соответствующий xml из того же директория по мере надобности.
я бы вообще всё это сделал примерно так:
1. Беру в обозначенное время xml со стороннего места.
2. Разбираю его сразу и складываю либо в массив, или объект, или вообще в БД.
3. Когда нужно просто беру из своих источников ту информацию, что в них есть, совершенно не парясь, что там на стороннем серванте, ибо чётко знаю, что в назначенное время у меня там всё равно будет всё обновлено. Ну или хотя бы на телефон придёт сообщение, что с cron'ом какая-то беда.
а логику трудно прикрутить?
одним скриптом в назначенное время складываешь сторонний xml в какой-то директорий, а другим скриптом берёшь соответствующий xml из того же директория по мере надобности.
я бы вообще всё это сделал примерно так:
1. Беру в обозначенное время xml со стороннего места.
2. Разбираю его сразу и складываю либо в массив, или объект, или вообще в БД.
3. Когда нужно просто беру из своих источников ту информацию, что в них есть, совершенно не парясь, что там на стороннем серванте, ибо чётко знаю, что в назначенное время у меня там всё равно будет всё обновлено. Ну или хотя бы на телефон придёт сообщение, что с cron'ом какая-то беда.
я не знаю как написать сам скрипт, который выполнит вышеуказанные действия
ну подумай головой. не глумись над людьми. там всё просто. почитай буквы в Сети, в конце-концов, там всё написано.
ну подумай головой. не глумись над людьми. там всё просто. почитай буквы в Сети, в конце-концов, там всё написано.
да читаю. Просто ничего толкового не нашел. Мне бы небольшой пример, как например кэшировать вот такой скрипт http://nomagic.ru/article.php?aid=24 а дальше я сам.
Я понимаю что для Вас это просто и понятно, но я только начинаю изучать php, и для меня не все ясно. Прошу прощения, если уже достал, но без Вашей помощи - никак....
Идею в общих чертах вам описали - вам нужно лишь собрать ее в виде кода. Ну или как вариант можете заплатить тому кто разбирается, чтобы он в законный выходной, в летний солнечный день делал за вас вашу работу, сидя за компьютером
Делаем базу имен с полями id, name, lastupdate
{
$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");
}
}
}
Должно работать...
Допустим, каждый файл уникальное имя имеет. И у каждого файла есть свойство "последнее обновление" или типа того. Вот и всё. Просто пробегаетесь по файлам, смотрите как давно он обновлялся. При необходимости - обновляете его новыми данными.
За основу брал этот скрипт http://spectator.ru/entry/1832
хорошо, но есть свои недостатки. время модификации файла легко изменить, тем-же touch'ем, файл можно легко затереть, если файлов в папке очень много - будет тормозить.
Это уже проблема программиста, а не метода.
Если любой может спокойно вызвать touch на файл, то это уже проблема защиты. Да и кол-во файлов для появления тормозов - дело спорное. Вряд ли у ТС будет в кэше хотя бы 200 файлов.
1. "touch'ем, файл можно легко затереть" - каким образом? В принципе даже если файл удалят, то ничего страшного не будет, скрипт просто загрузит его заново.
2. "Вряд ли у ТС будет в кэше хотя бы 200 файлов." - На самом деле файлов будет намного больше 200. Как вариант - сделать авто очистку папки каждых 12 часов. Как Вы считаете, этого достаточно?
Еще такой вопрос: Написал скрипт, который на баннере рисует статистику игрока. Каждый игрок свой баннер будет использовать на разных форумах. Получается что при каждом открытии страницы форума, будет обрабатываться скрипт у меня на сервере. Как Вы считаете, стоит ли кэшировать изображения, или нет разницы, загружается ли просто картинка, или обрабатывается скрипт?