php - 使用 PhantomJS 创建用于 PDF 创建 (PHP) 的 HighCharts 图表服务器端 - 导致 PHPs exec() 的退出代码 11;

标签 php highcharts phantomjs

我正在尝试创建使用 Higharts 服务器端生成的图形图像以用于 PDF 创建。

我已经在我的 Centos 6.5 服务器上安装了 PhantomJS 以运行生成 Highcharts 图像。

我正在使用 PHP,并且正在努力理解我需要采取的步骤来实际“运行”javascript,这将导致图像保存在服务器端以用于我的 PDF(我正在使用 mPDF 生成 PDF)。

我需要的流程:

  • 用户点击“下载 PDF”
  • 在服务器端生成几个图表和图形,保存到服务器上的一个文件中
  • mPDF 可以在构建 PDF 和提供下载时引用这些文件

到目前为止,这是我尝试过的

从 PHP 运行 PhantomJS 正在关注this堆栈溢出问题“如何从 PHP 执行 PhantomJS”我推断我可以以这种方式运行 PhantomJS 应用程序。

exec('/usr/bin/phantomjs test.js');

其中 test.js 是一个 javascript 文件,其中包含构建 Highcharts 和生成 PNG 格式的相关图形的导出图像文件所需的 javascript。

测试 PhatomJS 的 exec() 方法 我通过测试

测试了使用php成功运行phatomjs

exec('/usr/bin/phantomjs --version', $o, $e);

打印_r($o); echo $e;

这正确地给出了我的 phantomJS 版本号 (1.9.8) 和一个 0 错误代码(表示没有错误)所以我认为 PhantomJS 已经启动并运行正常并且我正在使用正确的路径来访问它,并且看起来可以正常执行。

创建一个 Javascript 文件来生成图形的服务器端图像

正在关注 this回答和我类似的问题,我推断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,我看到了 here是段错误?

测试

请注意,我已经使用 phantomJS 站点提供的一个简单的屏幕截图示例测试了 js 脚本:

var page = require('webpage').create();
page.open('http://github.com/', function() {
  page.render('github.png');
  phantom.exit();
});

替换我的 highcharts 生成 javacsript,但它也返回退出代码 11。

我认为这可能是一个写访问问题,所以测试了它写入一个我将 chmod 更改为 777 的文件。没有区别

从命令行运行上述测试脚本会导致 phantomJS 崩溃和段错误。

我现在还尝试运行一个 js 文件,该文件根本不尝试写入服务器,只写入“Hello, world!”。到控制台日志,当下面是test.js的唯一占用时,退出代码11仍然存在

console.log('Hello, world!');
phantom.exit();

最佳答案

这原来是物理内存的问题。我为我的服务器分配了 2GB,而 phantomJS 试图在每次运行时至少分配 1GB,有时这不是免费的,我会遇到段错误。

我将机器上的内存增加到 4Gb,没有遇到任何问题。

关于php - 使用 PhantomJS 创建用于 PDF 创建 (PHP) 的 HighCharts 图表服务器端 - 导致 PHPs exec() 的退出代码 11;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26984635/

相关文章:

javascript - 从数据库重新加载内容 onclick

javascript - 使用php和js更改表格单元格中文本的颜色

php mail onclick on link执行mysql命令

javascript - 切换图例可见性时,highcharts 堆叠列重叠

vue.js - 当我添加 vue-i18n (karma + mocha + phantomJs) 时,Vue 项目测试失败

javascript - 有没有办法对网站上的每个页面进行截图?

php - 数据库更新错误数据

php - Highcharts 不显示任何内容只是空白的 html 页面

javascript - 如何在 xaxis 中找到单个单元格的宽度? (引用截图)

node.js - 将 phantomjs 和 casperjs 与 Nodejs 脚本一起使用?