我刚刚开始使用(新的)Google Charts api,它非常酷。我正在使用此api成功创建图表。

但是,我有吞吐量方面的挑战。在我的应用程序中,我从NOAA提取的实时数据生成了三个图表。获取数据,将其整理成图表形式,然后在客户端绘制图表所花费的时间是令人无法忍受的缓慢的用户体验。

因此,我的想法是在(托管)服务器上定期(每15-30分钟)生成一次图表,然后将最新的图像提供给访问者。

我查看了phantomjs(按照this post的建议),但看起来它使用的是.exe文件,因此无法将其上传到共享主机。

对于专有解决方案(Highcharts)也有this thread,但是我想先探索开源替代方案,然后再走Highcharts路径。

其他解决方案着重于允许用户将呈现的图表另存为图像,但是我的目标是永远不要在浏览器中呈现该图表,或者除了在页面请求时包含图像之外,不加载任何服务器负载。

我只是没有看到能处理动态生成的图表的任何内容,这些图表在呈现页面时被“自动”转换为“自动”提供的图像。

总而言之,这是我要拼凑的三个部分:

1)从第三方(在这种情况下为NOAA)提取数据并将数据呈现为Google图表(完成,此处无问题)
2)在服务器端自动将每个呈现的图表转换为图像,并创建图像url
3)在呈现之前(通过php)将图表的图片网址(将经常刷新)粘贴到网页的html中

P.S.可以为每个图表图像都有一个静态网址...我没有创建图像文件...

有什么建议吗?我想念什么吗?

最佳答案

使用Watir加载网页并保存图像。 Watir是基于Ruby的测试平台,旨在测试网页。我将执行以下操作。

  • 创建一个呈现图表的网页。那不是为了
    供公众使用,仅用于生成图表图像。
  • 添加为每个图表调用getImageURI()的Javascript,以获取
    PNG数据。
  • 使用Ajax在服务器上调用PHP脚本。传递PNG数据
    并将其保存到文件中。
  • 在Watir中编写一个脚本,只需打开浏览器并加载您的
    网页。
  • 调度Watir脚本以根据需要运行。

  • Watir脚本可以在任何本地计算机(PC或Mac)甚至服务器上运行。

    这是通过Ajax将PNG数据发送到PHP脚本的Javascript。只是获取图像数据并将其发送的摘要,而不是完整的解决方案。
    // Instantiate and draw our chart, passing in some options.
    var chart = new google.visualization.PieChart(chartDiv);
    // Wait for the chart to finish drawing before calling the getImageURI() method.
    google.visualization.events.addListener(chart, 'ready', function () {
        pieDone=1;
        piePNG=chart.getImageURI();
        saveChartPNGs(piePNG);
    });
    chart.draw(data, options);
    
    function saveChartPNGs(png)
    {
      var jsonSavePNG = $.ajax({
        type: "POST",
        url: pngSaveUrl,
        dataType:"json",
        data: 'png=' + png
      }).done();
    }
    

    该PHP代码处理Ajax调用并保存文件。
    if (isset($_REQUEST['png']))
    {
        // Remove header string
        $data=str_replace('data:image/png;base64,','',$_REQUEST['png']);
        // Restore data to original format; convert space to '+'
        $data=str_replace(' ','+',$data);
        // Save PNG file
        $outFile=DOC_ROOT.'/atest.png';
        // Decode base 64 before saving
        $fres=file_put_contents($outFile, base64_decode($data));
    }
    

    在本地计算机上,Watir脚本(实际上是用Ruby编写的)很简单。
    # Load watir
    require 'watir-webdriver'
    require "watir-webdriver/extensions/alerts"
    
    # Launch the browser; common choices: chrome, firefox, ie.
    # Headless browsers are available.
    browser = Watir::Browser.new :chrome # chrome browser window
    
    # Load the web page
    browser.goto 'http://domain.net/page/'
    

    为了完全自动化Watir端,我将编写图表呈现网页以在完成保存文件后加载新页面。您可以让Watir在浏览器中检查该页面,然后退出直到再次执行。

    如果可以安排在服务器上安装Ruby,Watir和浏览器,则可以使用cron作业自动化整个方案。

    关于javascript - 生成服务器端Google图表作为图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24024616/

    10-12 00:35
    查看更多