Использование PhantomJS для создания серверной части Highcharts grahps для использования при создании PDF (PHP) - приводит к выходу кода 11 из PHPS exec();
Я пытаюсь создать изображения графиков, сгенерированных с использованием серверной части Higharts, для использования при создании PDF.
Я установил PhantomJS на свой сервер Centos 6.5, чтобы запустить генерацию изображений Highcharts.
Я использую PHP и изо всех сил пытаюсь понять шаги, которые мне нужно предпринять, чтобы фактически "запустить" javascript, что приведет к сохранению изображений на стороне сервера для использования с моими PDF-файлами (я использую mPDF для создания PDF-файлов).
Процесс I нужно:
- Пользователь нажимает "загрузить 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 --версия', $o, $e);
Печать_r($o); эхо $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 входит?)
- Как я могу заставить его отображать PNG вместо PDF?
Использование отчета об ошибке exec выше дает мне код выхода 11, который я вижу здесь является ошибкой сегментации?
Тестирование
Примечание. Я протестировал сценарий js с помощью простого примера захвата экрана, который предоставляет сайт PhantomJS:
var page = require('webpage').create();
page.open('http://github.com/', function() {
page.render('github.png');
phantom.exit();
});
Чтобы заменить мой javacsript поколения highcharts, но он также возвращает код выхода 11.
Я подумал, что это может быть проблема с доступом для записи, поэтому протестировал запись в файл, в котором я изменил chmod на 777. Никакой разницы
Запуск вышеупомянутого тестового сценария из командной строки приводит к сбою PhantomJS и ошибке сегментации.
Я также попытался запустить файл js, который вообще не пытается писать на сервер, только пишет "Привет, мир!" в журнал консоли, код выхода 11 остается, когда ниже указано единственное заполнение test.js
console.log('Hello, world!');
phantom.exit();
1 answers
Оказалось, что это проблема с физической памятью. У меня было выделено 2 ГБ на мой сервер, и PhantomJS стремился распределять 1 ГБ по крайней мере каждый раз, когда он запускался, иногда это было не бесплатно, и мне давали ошибки сегментации.
Я увеличил объем памяти на компьютере до 4 Гб, и у меня не было никаких проблем.