glo*_*idt 8 javascript php charts image google-visualization
我刚刚开始使用(新)Google Charts api,而且很酷.我用这个api成功创建了图表.
然而,我遇到了吞吐量挑战.在我的应用程序中,我从NOAA中提取的实时数据生成三个图表.获取数据,按下图表形式然后绘制客户端图表所需的时间是一种无法忍受的缓慢用户体验.
所以我的想法是在(托管的)服务器上定期生成图表(每15-30分钟),然后只为访问者提供最新的图像.
我看着phantomjs(在推荐这个帖子),但它看起来像它的.exe文件使用,我不能上传到我的共享主机.
还有这个专有解决方案的线程(Highcharts),但我想在沿着Highcharts路径前先探索开源替代方案.
其他解决方案专注于允许用户将渲染图表保存为图像,但我的目标是永远不会在浏览器中呈现图表,或者除了在页面请求时包含图像之外还有任何服务器负载.
我只是没有看到任何处理动态生成的图表,这些图表被"自动"转换为在呈现页面时"自动"提供的图像.
总之,以下是我想要拼凑的三件作品:
1)从第三方(在这种情况下为NOAA)提取数据并将数据呈现为Google图表(完成,此处没有问题)2)将每个渲染图表自动转换为图像,服务器端和创建图像URL 3)粘贴图像在呈现之前(通过php)将图表的URL(将经常刷新)到网页的html中
PS可以为每个图表图像设置一个静态URL ...我不是在创建图像存档...
有什么建议?我错过了什么吗?
使用Watir加载网页并保存图像。Watir 是一个基于 Ruby 的测试平台,旨在测试网页。我会做以下事情。
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();
}
Run Code Online (Sandbox Code Playgroud)
此 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));
}
Run Code Online (Sandbox Code Playgroud)
在您的本地计算机上,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/'
Run Code Online (Sandbox Code Playgroud)
为了完全自动化 Watir 端,我将编写图表渲染网页以在保存文件完成后加载新页面。您可以让 Watir 在浏览器中检查该页面,然后退出,直到它再次执行。
如果您可以安排在服务器上安装 Ruby、Watir 和浏览器,那么您可以使用 cron 作业自动执行整个场景。