Использование PhantomJS для создания серверной части Grahps HighCharts для использования при создании PDF (PHP) — приводит к выходу кода 11 из PHPs exec ();

Я пытаюсь создать изображения графиков, созданных на стороне сервера Higharts, для использования в создании PDF.

Я установил PhantomJS на свой сервер Centos 6.5, чтобы запустить генерацию образов Highcharts.

Я использую PHP и пытаюсь понять, какие шаги мне нужно предпринять, чтобы на самом деле «запустить» javascript, который приведет к сохранению изображений на стороне сервера для использования с моими PDF-файлами (я использую mPDF для генерации PDF-файлов).

Процесс мне нужен:

  • Пользователь нажимает «скачать 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 находится в?)

  1. Как я могу получить его для рендеринга PNG вместо PDF?

При использовании отчета об ошибках 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();

4

Решение

Это оказалось проблемой с физической памятью. Для моего сервера было выделено 2 ГБ, и phantomJS пытался выделить 1 ГБ, по крайней мере, при каждом запуске, иногда это было не бесплатно, и мне давали ошибки сегментации.

Я увеличил объем памяти на машине до 4 Гб и у меня не было никаких проблем.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]