Я пытаюсь создать изображения графиков, созданных на стороне сервера Higharts, для использования в создании PDF.
Я установил PhantomJS на свой сервер Centos 6.5, чтобы запустить генерацию образов Highcharts.
Я использую PHP и пытаюсь понять, какие шаги мне нужно предпринять, чтобы на самом деле «запустить» javascript, который приведет к сохранению изображений на стороне сервера для использования с моими PDF-файлами (я использую mPDF для генерации PDF-файлов).
Процесс мне нужен:
Вот что я пробовал до сих пор
Запуск PhantomJS из PHP
Следующий этот вопрос переполнения стека «как выполнить PhantomJS из PHP» Я делаю вывод, что могу запускать приложение PhantomJS таким способом.
exec('/usr/bin/phantomjs test.js');
Где test.js — это файл javascript, содержащий javascript, необходимый для построения старшей диаграммы и создания файла экспортированного изображения рассматриваемого графика в формате PNG.
Тестирование метода exec () для PhatomJS
Я проверил успешный запуск phatomjs с использованием php путем тестирования
exec (‘/ usr / bin / phantomjs —version’, $ o, $ e);
print_r ($ о);
echo $ e;
Это правильно дает мне номер версии phantomJS (1.9.8) и код ошибки 0 (без ошибок), так что я думаю, что PhantomJS работает и работает нормально, и я использую правильный путь, чтобы добраться до него, и, кажется, выполняется все хорошо
Создание файла Javascript, который создаст изображение графа на стороне сервера
Следующий этот Отвечая на мой аналогичный вопрос, я делаю вывод, что форма файла test.js должна выглядеть примерно так:
var system = require('system');
var page = require('webpage').create();
var fs = require('fs');
// load JS libraries
page.injectJs("https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js");
page.injectJs("/js/highcharts/highcharts.js");
page.injectJs("/js/highcharts/modules/exporting.js");// chart demo
var args = {
width: 600,
height: 500
};
var svg = page.evaluate(function(opt){
$('body').prepend('<div id="container"></div>');
var chart = new Highcharts.Chart({
chart: {
renderTo: 'container',
width: opt.width,
height: opt.height
},
exporting: {
enabled: false
},
title: {
text: 'Combination chart'
},
xAxis: {
categories: ['Apples', 'Oranges', 'Pears', 'Bananas', 'Plums']
},
yAxis: {
title: {
text: 'Y-values'
}
},
labels: {
items: [{
html: 'Total fruit consumption',
style: {
left: '40px',
top: '8px',
color: 'black'
}
}]
},
plotOptions: {
line: {
dataLabels: {
enabled: true
},
enableMouseTracking: false
},
series: {
enableMouseTracking: false,
shadow: false,
animation: false
}
},
series: [{
type: 'column',
name: 'Andrii',
data: [3, 2, 1, 3, 4]
}, {
type: 'column',
name: 'Fabian',
data: [2, 3, 5, 7, 6]
}, {
type: 'column',
name: 'Joan',
data: [4, 3, 3, 9, 0]
}, {
type: 'spline',
name: 'Average',
data: [3, 2.67, 3, 6.33, 3.33],
marker: {
lineWidth: 2,
lineColor: 'white'
}
}, {
type: 'pie',
name: 'Total consumption',
data: [{
name: 'Andrii',
y: 13,
color: '#4572A7'
}, {
name: 'Fabian',
y: 23,
color: '#AA4643'
}, {
name: 'Joan',
y: 19,
color: '#89A54E'
}],
center: [100, 80],
size: 100,
showInLegend: false,
dataLabels: {
enabled: false
}
}]
});
return chart.getSVG();
}, args);
// Saving SVG to a file
fs.write("demo.svg", svg);
// Saving diagram as PDF
page.render('demo.pdf');
phantom.exit();
Но это, кажется, записывает pdf и png файл куда-нибудь (где? Тот же каталог test.js находится в?)
При использовании отчета об ошибках exec выше приведен код завершения 11, который я вижу Вот такое ошибка сегментации?
тестирование
Примечание. Я протестировал скрипт js на простом примере снимка экрана, который предоставляет сайт phantomJS:
var page = require('webpage').create();
page.open('http://github.com/', function() {
page.render('github.png');
phantom.exit();
});
Чтобы заменить мой javacscript поколения highcharts, но он также возвращает код выхода 11.
Я подумал, что это может быть проблема с правами на запись, поэтому проверил запись в файл, где я изменил chmod на 777. Без разницы
Запуск вышеуказанного тестового сценария из командной строки приводит к сбою phantomJS и ошибке сегментации.
Я также попытался запустить файл js, который вообще не пытается записать на сервер, а только пишет «Hello, world!» в журнале консоли код завершения 11 остается, когда нижеприведенное является единственным местом, где находится test.js
console.log('Hello, world!');
phantom.exit();
Это оказалось проблемой с физической памятью. Для моего сервера было выделено 2 ГБ, и phantomJS пытался выделить 1 ГБ, по крайней мере, при каждом запуске, иногда это было не бесплатно, и мне давали ошибки сегментации.
Я увеличил объем памяти на машине до 4 Гб и у меня не было никаких проблем.
Других решений пока нет …