如何将phantomjs单独部署在服务端
如何将phantomjs单独部署在服务端
hey,every one ,很久没给大家分享技术型的文章啦,今天抽时间来一发吧
一. 容我分析(lao dao)几句
之前写了2篇 highcharts 结合 phantomjs 后端生成图片的文章,
http://www.peng8.net/2014/07/21/render-charts-serverside/
http://www.peng8.net/2014/11/24/highchart-table-export-image-by-phantomjs/
第一篇呢,纯后端生成,动态生成json,并将json存在文件中,后端调用phantomjs.exe ,将生成的json文件传入 phantomjs 中。
第二篇呢,是通过前端触发,将页面上的渲染出来的图表和TABLE 整个一起生成一张图片,其实这种也可以放在后端执行。
以上2种方式,都会有个缺点,就是当生成的图片很多,或者请求页面很多时,我们要重复一次一次的去调用phantomjs.exe这个玩意,耗内存,耗时间,直到昨天突然有个群里的人问我,在服务端单独部署一个phantomjs.exe ,开启一个端口,它一直运行着,只要有请求发向它,它就生成一个base64的字符串返回回来,其实官方已经提供了将phantomjs.exe单独部署的方法,于是我研究了一番,最后分享给大家。好了,唠叨结束,接下来我们看看是如何实现的?
二. 服务端 Look here
我用.NET新建一个解决方案,里面包含了2个项目,一个web项目,另外一个是winform项目,当然你也可以弄2个web项目,不影响部署。
<1> 服务端phantomjs搭建
- 一些准备文件phantomjs.exe和highcharts工具包
- winform界面写出来 服务界面 服务界面
- winform后端核心代码
 1 #region 启动进程 
 Process p = new Process();
 p.StartInfo.FileName = Environment.CurrentDirectory + "//phantomjs//phantomjs_1.9V.exe"; string ExcuteArg = Environment.CurrentDirectory + "//script//highcharts-convert.js -host 127.0.0.1 -port 3003";
 p.StartInfo.Arguments = string.Format(ExcuteArg);
 p.StartInfo.CreateNoWindow = false;
 p.StartInfo.UseShellExecute = false;
 //重定向标准输出
 p.StartInfo.RedirectStandardOutput = true;
 //重定向错误输出
 p.StartInfo.RedirectStandardError = false; ;
 p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
 string[] result = { };
 if (!p.Start())
 {
 throw new Exception("无法启动Headless测试引擎.");
 } result = p.StandardOutput.ReadToEnd().Split(new char[] { '\r', '\n' });
 if (result.Length == 0)
 {
 result[0] = "已成功启动,但无数据";
 }
 foreach (string s in result)
 {
 list_Msg.Items.Add(s);
 }
 #endregion
<2> web端搭建及如何调用phantomjs
- web页面搭建 web界面 web界面
 实际上这个步骤可以省略,只是为了展示返回的数据而已,毕竟可以纯后端生成。
- 向phantomjs 发起post请求的核心代码 - 1 - private string HttpPostNew(string Url, string postDataStr) 
 {
 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
 request.Method = "POST";
 request.ContentType = "application/x-www-form-urlencoded";
 request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr); Stream myRequestStream = request.GetRequestStream();
 StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));
 myStreamWriter.Write(postDataStr);
 myStreamWriter.Close(); HttpWebResponse response;
 try
 {
 response = (HttpWebResponse)request.GetResponse();
 }
 catch (WebException ex)
 {
 response = (HttpWebResponse)ex.Response;
 }
 Stream myResponseStream = response.GetResponseStream();
 StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
 string retString = myStreamReader.ReadToEnd();
 myStreamReader.Close();
 myResponseStream.Close(); return retString;
 }- 按钮的调用代码
1 string url = "http://localhost:3003/"; 
 string param= "{\"infile\":\"{ xAxis: { categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']},series: [{ data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]}]}; \",\"callback\":\"function(chart) { chart.renderer.arc(200, 150, 100, 50, -Math.PI, 0).attr({ fill: '#FCFFC5',stroke: 'black','stroke-width' : 1}).add(); } \",\"constr\":\"Chart\"}";
 TextBox1.Text= HttpPostNew(url, param);
 MemoryStream stream = new MemoryStream(Convert.FromBase64String(TextBox1.Text));
 Bitmap bmp = new Bitmap(stream);
 string randomName = System.DateTime.Now.ToString("yyyyMMddhhssmm") + ".png";
 string saveUrl = Server.MapPath("/images/")+randomName;
 bmp.Save(saveUrl, ImageFormat.Png);
 stream.Dispose();
 stream.Close();
 bmp.Dispose();
 Image1.ImageUrl = "~/images/"+ randomName;
 
- 按钮的调用代码
三. 效果展示啦
 最后将base64转换成图片
最后将base64转换成图片
DEMO 下载地址 :点我下载
如何将phantomjs单独部署在服务端的更多相关文章
- IntelliJ IDEA openfire 使用IntelliJ IDEA 部署OPENFIRE 服务端
		用MyEclipse部署OF的步骤,网上有很多,可以自行google,这里要记录的是用据说最好用的JAVA编辑器IntelliJ IDEA来部署OF服务端.试了好多下,终于成功了,记录下. 直接上图吧 ... 
- Rsync同步部署web服务端配置
		Rsync同步部署web服务端配置 1,参数详解: -v, --verbose 详细模式输出. -q, --quiet 精简输出模式. -c, --checksum 打开校验开关,强制对文件传输进行校 ... 
- .net 部署到服务端IIS,Process调用exe程序无法运行问题解决
		场景: 开发某一功能将html内容转换为pdf,采用第三方插件wkhtmltopdf.exe进行转换.在本地调试正常运行,部署到服务端后文件没有正常生成. IIS中,Process打不开cmd程序,程 ... 
- Linux 部署 iSCSI 服务端
		Linux 部署 iSCSI 服务端 服务端实验环境 iSCSI-server :RHEL8 IP:192.168.121.10 一.服务端安装 target 服务和 targetcli 命令行工具 ... 
- 如何部署Icinga服务端
		Icinga是Nagios的一个变种,配置,使用方式几乎一样,而且完全兼容Nagios的插件.所以下面的部署方案对Nagios同样使用. 它还推出了两个中文版本,icinga-cn原版和icinga- ... 
- CentOS6部署VNC服务端
		VNC (Virtual Network Computer)是虚拟网络计算机的缩写.VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和 Wi ... 
- 部署zabbix服务端和客户端和网页
		一:安装zabbix服务端 1.部署准备 命令:iptables -F #关闭防火墙命令:systemctl stop firewalld #关闭防火墙 设置解析,自建yum源 命令:c ... 
- nagios系列(一)centos6.5环境部署nagios服务端
		nagios软件安装包存放目录:/home/oldboy/tools nagios服务安装目录:/usr/local/nagios 1.配置yum源 echo "------ step 1: ... 
- 群晖下虚拟机编译部署WOW服务端TrinityCore
		前言 前几天突然想玩WOW了,但是我是一个特别轻度的玩家,以前点卡的时候,我就是上去一个人做做任务,跑跑地图,不怎么玩副本和PVP,现在让我花钱充月卡,不太现实,没那个时间玩,所以,就考虑玩个私服,但 ... 
随机推荐
- thinkpad t440p 解决无线网卡驱动
			$ wget https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1239578/+attachment/4057550/+files/rtl_9 ... 
- 将开始我的WebForm控件开发之旅
			时间总是过得很快,一转眼三个月就过去了,三个月内发生了很多的事.因为学校的学习,离开了我入门WPF的公司:开发了第一个外包项目,做的是WebForm的:而且了马上要毕业了,毕业后的公司应该是专门用We ... 
- .NET开发Windows Service程序 - Topshelf
			在实际项目开发过程中,会经常写一些类似定时检查,应用监控的应用.这类应用在windows平台通常都会写成window service程序. 在百度上搜索一下'c#开发windows service', ... 
- js原型链与继承(初体验)
			js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ... 
- MySQL 主键冲突,无法插入数据
			数据库版本:5.6.16 问题:开发来电话说仓库无法下单,程序插入数据提示:入库单 xxxx1589762285确认失败:Duplicate entry '8388607' for key 'PRIM ... 
- Linux /dev 自动创建设备节点
			#include <linux/module.h> #include <linux/module.h> #include <linux/kernel.h> #inc ... 
- 将eclipse的应用程序打包成.exe
			转自:http://blog.163.com/loveshijie_1991/blog/static/1760553112012102573437156/ 参考:http://blog.csdn.ne ... 
- Elasticsearch 5.0
			Elasticsearch 5.0 使用ES的基本都会使用过head,但是版本升级到5.0后,head插件就不好使了.下面就看看如何在5.0中启动Head插件吧! 官方粗略教程 Running wit ... 
- python学习小结1:for循环控制语句
			用一个列表来确定for循环的范围 >>> x = [0,1,2,3,4] >>> for i in x: print i, 0 1 2 3 4 循环一个字符串 & ... 
- 高德开发 android 出现 key 鉴权失败
			环境windows + android studio 原因: 曾经更改过key.store 解决办法: 首先运行cmd移动到keystore的目录下keytool -list -keystore 文件 ... 
