如何将phantomjs单独部署在服务端

如何将phantomjs单独部署在服务端

文章目录

  1. 一. 容我分析(lao dao)几句
  2. 二. 服务端 Look here
    1. 服务端phantomjs搭建
    2. web端搭建及如何调用phantomjs
  3. 三. 效果展示啦

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搭建

  1. 一些准备文件
    phantomjs.exe 和 highcharts工具包
  2. winform界面写出来
    服务界面
  3. 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

  1. web页面搭建
    web界面
    实际上这个步骤可以省略,只是为了展示返回的数据而已,毕竟可以纯后端生成。
  2. 向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. 按钮的调用代码

      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转换成图片



DEMO 下载地址 :点我下载

时间: 2024-10-27 06:39:17

如何将phantomjs单独部署在服务端的相关文章

度量快速开发平台部署IIS服务端后提示不具备查看该目录和页的权限 ALC

今天在云虚拟机上部署度量快速开发平台服务端后,访问效果如下所示:  提示 不具备查看该目录或页面的权限,因为访问控制列表(ALC)对wrb服务器上的该资源进行了配置. 这个错误,主要是IIS上部署的服务端文件夹访问权限不够引起,只需要把服务端目录安全性设置为 network service用户完全控制即可.如果设置这个用户后仍然不行,则需要把everyone用户设置为完全控制才行.原文地址:http://bbs.delit.cn/thread-336-1-1.html 转载请注明出处: 撰写人:

CentOS6部署VNC服务端

VNC (Virtual Network Computer)是虚拟网络计算机的缩写.VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和 Windows 和 MAC 中的任何远程控制软件媲美. 在 Linux 中,VNC 包括以下四个命令:vncserver,vncviewer,vncpasswd,vncconnect. 下面以CentOS6.2为例,安装VNC步骤如下:     一.安装gnome桌面环境 如果系统已经安装了gnome桌

部署zabbix服务端和客户端和网页

一:安装zabbix服务端 1.部署准备 命令:iptables -F     #关闭防火墙命令:systemctl stop firewalld    #关闭防火墙 设置解析,自建yum源 命令:cd /etc/yum.repos.d/ 命令:curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo      #zabbix源链接 命令:curl -o /etc/yum.repo

用http请求thrift服务端出现了内存溢出的情况

记一次内存溢出的分析经历 - Janti - 博客园 https://www.cnblogs.com/superfj/p/8474288.html 说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机,来解决内存溢出的痛苦吗? 你经历过一个BUG,百思不得其解,头发一根一根脱落的烦恼吗? 我知道,你有过! 但是我还是要来说说我的故事.................. 背景: 有一个项目做一个系统,分客户端和服务端,客户端用c++写的,用来收集信息然后传给服务

linux svn 服务端搭建

环境是centos6.x. 关于团队对代码管理,相信大部分人习惯于svn.不过我个人比较喜欢git的.这个blog git 常用命令 就是介绍git的基本用法.现部署svn服务端方式如下: 1. 用yum安装如下: yum install subversion2. 输入 svn --help可以查看svn的使用方法. usage: svn <subcommand> [options] [args] Subversion command-line client, version 1.6.11.

webservice -- cxf客户端调用axis2服务端

背景: 有个项目, 需要由第三方提供用户信息, 实现用户同步操作, 对方给提供webservice接口(axis2实现)并也使用axis2作主客户端调用我方提供的webservice接口 起初, 由于项目使用了spring, 且spring可与cxf较好的集成, 所以也就选用了cxf, 可问题随之出现, 接口可以调用到, 接口的具体方法也可以调用到, 但是, 1. cxf作为客户端, 获取服务端返回值时均为null. 2. cxf作为服务端, 获取axis2客户端传来的参数时, 也均为null.

监控服务zabbix部署(server端)

zabbix介绍zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题.zabbix由2部分构成,zabbix server与可选组件zabbix agentzabbix server可以通过SNMP,zabbix agent ,ping,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,它可以运行在Linux,Ubuntu,

使用Zabbix服务端本地邮箱账号发送报警邮件的部署记录

邮件报警有两种情况:1)Zabbix服务端只是单纯的发送报警邮件到指定邮箱,发送报警邮件的这个邮箱账号是Zabbix服务端的本地邮箱账号(例如:[email protected]),只能发送,不能接收外部邮件.2)使用一个可以在互联网上正常收发邮件的邮箱账号(例如:[email protected]),通过在Zabbix服务端中设置,使其能够发送报警邮件到指定邮箱.上面第2中使用外部邮箱发送报警邮件之前已经介绍了:分布式监控系统Zabbix-3.0.3-完整安装记录(5)-邮件报警部署.下面说下

创建APPID&amp;&amp;部署服务端教程

创建APPID&&部署服务端 一.创建APPID 1.打开https://console.developers.google.com ,左击顶部Project,然后左击创建项目 2.输入项目名称后,会自动帮你匹配可用ID,然后左击创建(请细读此教程底部) 3.2016年12月后新注册用户部署AppID出现404错误 4.需要我们设置APPid的APP引擎 (1)打开https://console.cloud.google.com/home/ (Google Cloud Platform),