Создание графиков с помощью pChart. Кэширование

Проекты с высоким числом посещаемости всегда ищут способы снизить нагрузку. Одной из самых ресурсоемких операций, которые могут встретиться в таких проектах – это генерирование графиков отчетности и статистики. В настоящее время библиотека pChart предоставляет возможность снизить затраты ресурсов с помощью кэширования.

Быстрый старт
Вот небольшой скрипт, который сгенерирует график и сохранит его в КЭШе для дальнейшего использования. В этом скрипте используется схема данных, которая использовалась во всех статьях цикла (см. ссылки внизу), поэтому настоятельно рекомендую прочитать хотя бы первую.

pchart_cached.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
error_reporting(0);
 
//подключаем файлы
include 'pChart/pData.class';
include 'pChart/pChart.class';
include 'pChart/pCache.class';
 
//получаем данные из файла
$d = getdata(dirname(__FILE__).DIRECTORY_SEPARATOR.'rts.txt');
$d['date'] = array_reverse($d['date']);
$d['rts'] = array_reverse($d['rts']);
$d['rts2'] = array_reverse($d['rts2']);
 
//создаем объект данных
$DataSet = new pData;
//добавлем точки
$DataSet->AddPoint($d['rts'],"Serie1");
$DataSet->AddPoint($d['rts2'],"Serie2");
$DataSet->AddPoint($d['date'],"Serie3");
//устанавливаем точки с датами
//на ось абсцисс
$DataSet->SetAbsciseLabelSerie("Serie3");
//помечаем данные как предназначеные для
//отображения
$DataSet->AddSerie("Serie1");
$DataSet->AddSerie("Serie2");
//устанавливаем имена
$DataSet->SetSerieName(
        mb_convert_encoding("Индекс РТС",'utf-8',
'windows-1251'),
        "Serie1");
$DataSet->SetSerieName(
        mb_convert_encoding("Индекс РТС2",'utf-8',
'windows-1251'),
        "Serie2");
 
//Создаем кэш
 $Cache = new pCache(dirname(__FILE__).DIRECTORY_SEPARATOR);
 //спрашиваем: а есть ли в кэше наш график?
 $Cache->GetFromCache("myGraph",$DataSet->GetData());
 
//создаем график шириной в 1000 и высотой в 500 px
$graph = new pChart(1000,500);
//устанавливаем шрифт и размер шрифта
 $graph->setFontProperties("Fonts/tahoma.ttf",10);
 //координаты левой верхней вершины и правой нижней
 //вершины графика
 $graph->setGraphArea(85,30,950,400);
 //рисуем заполненный четырехугольник
 $graph->drawFilledRoundedRectangle(7,7,993,493,5,240,240,240);
 //теперь незаполненный для эффекта тени
 $graph->drawRoundedRectangle(5,5,995,495,5,230,230,230);
 //прорисовываем фон графика
 $graph->drawGraphArea(255,255,255,TRUE);
 //устанавливаем данные для графиков
 $graph->drawScale($DataSet->GetData(),
         $DataSet->GetDataDescription(),
         SCALE_NORMAL,150,150,150,true,0,2);
 //рисуем сетку для графика
 $graph->drawGrid(4,TRUE,230,230,230,50);
 
 //прорисовываем линейные графики
 $graph->drawLineGraph($DataSet->GetData(),
         $DataSet->GetDataDescription());
 // рисуем точки на графике
 $graph->drawPlotGraph($DataSet->GetData(),
         $DataSet->GetDataDescription(),3,2,255,255,255);
 
 // пишем в подвале некоторый текст
 $graph->setFontProperties("Fonts/tahoma.ttf",8);
 $graph->drawTextBox(870,450,990,460,"Powered By pChart",
         0,250,250,250,ALIGN_CENTER,TRUE,-1,-1,-1,30);
 $graph->drawTextBox(805,470,990,480,"http://pchart.sourceforge.net",
         0,250,250,250,ALIGN_CENTER,TRUE,-1,-1,-1,30);
 $graph->drawTextBox(15,450,140,460,"Developed By web-junior",
         0,250,250,250,ALIGN_CENTER,TRUE,-1,-1,-1,30);
 $graph->drawTextBox(10,470,140,480,"http://www.web-junior.net",
         0,250,250,250,ALIGN_CENTER,TRUE,-1,-1,-1,30);
 
//ложим легенду
$graph->drawLegend(90,35,$DataSet->GetDataDescription(),255,255,255);
 
 //Пишем заголовок
 $graph->setFontProperties("Fonts/tahoma.ttf",10);
 $graph->drawTitle(480,22,
         mb_convert_encoding("Индексы РТС",
                 'utf-8','windows-1251'),
         50,50,50,-1,-1,true);
 
//сохраним на всякий случай
 $Cache->WriteToCache("myGraph",$DataSet->GetData(),$graph);
 
//выводим в браузер
 $graph->Stroke();
 
 
/**
 * @return array
 */
function getdata($file)
{
    if (file_exists($file)) {
 
        $lines = file($file);
        $data = array('date' => array(), 'rts' => array(),
            'rts2' => array());
        foreach ($lines as $line) {
            $tmp = explode(' ', trim($line));
            $data['date'][] = $tmp[0];
            $data['rts'][] = trim($tmp[1]);
            $data['rts2'][] = trim($tmp[2]);
        }
 
        return $data;
    } else {
        return false;
    }
}
?>

В результате получим график

Чудо-график будет закэширован

Если был правильно настроен кэш, то все обращения к графику, кроме первого, будут взяты из КЭШа. Файлы КЭШа будут расположены в текущей директории. PHP должен иметь права для записи в папку, в которой будут расположены файлы КЭШа.

Подробности
Теперь разберем основы работы с КЭШем. Подробную документацию методов КЭШа на английском можно найти здесь. Там же лежит очень интересная схема работы системы кэширования.

С КЭШем в этой библиотеке работает класс pCache. Схема работы КЭШа достаточно проста. После генерации данных, создается кэш и запрашивается у него, сохранен ли ранее такой рисунок. Если сохранен, то кэш отображает этот рисунок и завершает работу скрипта. Если нет, то график создается обычным образом и сохраняется в КЭШе.

В примере используются всего 3 метода класса. Для создания объекта КЭШа нужно вызвать конструктор класса следующим образом:

1
$Cache = new pCache(dirname(__FILE__).DIRECTORY_SEPARATOR);

Аргумент один:

  • string $CacheFolder – папка, в которой будут располагаться файлы закэшированных графиков. Аргумент не обязателен, по умолчанию имеет значение «Cache/». PHP должен иметь права на запись для этой папки. Обязательно должен завершаться слешем

Проверить существование графика в КЭШе можно, вызвав метод

1
$Cache->GetFromCache("myGraph",$DataSet->GetData());

Если график с идентификатором «myGraph» и данными, которые находятся в объекте $DataSet существует в КЭШе, то метод отобразит график и завершит работу скрипта. Аргумента два, оба обязательные:

  • string $ID – уникальный текстовый идентификатор, который каким-либо образом идентифицирует график в КЭШе. Текст «bla-bla-bla» вполне подойдет =);
  • string $Data – данные графика, которые можно получить из объекта класса pData посредством вызова метода $pData->GetData();

Если графика в КЭШе нет, то его нужно сгенерировать и положить в кэш. Сохранить в КЭШе график можно, вызвав метод

1
$Cache->WriteToCache("myGraph",$DataSet->GetData(),$graph);

Этот метод нужно вызвать до генерации графика, т.е. до вызова метода Stroke() или Render(). У метода всего три аргумента:

  • string $ID – уникальный текстовый идентификатор, такой же как и в методе GetFromCache();
  • string $Data – данные графика, которые можно получить из объекта класса pData посредством вызова метода $pData->GetData();
  • pChart $Picture – объект графика подготовленного к генерации. Это объект класса pChart.

Читайте все статьи цикла

Популярность: 9%


Интересное из других блогов:

2leep.com

И не забывайте комментировать статью.

Добавляйся в группу во вконтакте, чтобы самым первым узнавать все новости сайта

Отзывов: 3 на «Создание графиков с помощью pChart. Кэширование»

  1. Автор: Alexander, 23 июля 2011 в 22:09

    использует Opera 10.63 Opera 10.63 на Windows XP Windows XP

    Извините за глупость, но можно ли после создания графика использовать $Data?

    • Автор: web-junior, 24 июля 2011 в 11:31

      использует Google Chrome 12.0.742.82 Google Chrome 12.0.742.82 на GNU/Linux x64 GNU/Linux x64

      Вы имеете в виду $DataSet – объект класса pData?

  2. Автор: pptp, 29 июля 2011 в 14:00

    использует Firefox 5.0 Firefox 5.0 на Windows 7 Windows 7

    бывает проблема: при одновременном обращении по такому алгоритму к одному и тому же графику, кэш иногда падает и выдает чепуху вместо картинки

RSS-лента комментариев. Адрес для трекбека

Ваш отзыв

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Нажимая на кнопку "Добавить" вы принимаете правила комментирования