Создание графиков с помощью 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.
Читайте все статьи цикла
- Создание графиков с помощью JpGraph
- Создание графиков с помощью pChart
- Создание графиков с помощью pChart. Продолжение
- Создание графиков с помощью pChart. Кэширование
Популярность: 9%
Интересное из других блогов:
2leep.comИ не забывайте комментировать статью.
Добавляйся в группу во вконтакте, чтобы самым первым узнавать все новости сайта

Автор: Alexander, 23 июля 2011 в 22:09
используетИзвините за глупость, но можно ли после создания графика использовать $Data?
Автор: web-junior, 24 июля 2011 в 11:31
используетВы имеете в виду $DataSet – объект класса pData?
Автор: pptp, 29 июля 2011 в 14:00
используетбывает проблема: при одновременном обращении по такому алгоритму к одному и тому же графику, кэш иногда падает и выдает чепуху вместо картинки