Использование 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 входит?)

  1. Как я могу заставить его отображать 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();
Author: Community, 2014-11-18

1 answers

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

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

 0
Author: Gideon, 2014-11-24 05:23:47