phantomjs+echartsconvert踩坑记第二弹

30 阅读2分钟

phantomjs+echartsconvert踩坑记第二弹

问题出现

首先起因是需要在一台无外网的centos机器上做应用的部署验证,phantomjs启动的时候会报错找不到font字体,安装了默认缺失的字体后,导出echarts图又报错

报错现象

• 执行导出命令(包含多张echarts参数后端生成的图片)

• 现象: 图片均一样且没有文字,且生成的图都为随机一张

解决思路:

• 首先拆解问题:1、图片一样;2、无字体

• 是否前端传输的echart数据有问题:1、检查接口前端传参-按理调试过程中已经核对,此处可以再校验,发现数据不是

• 那么只有一种可能,后端生成问题

• 图片一样:代表调用echarts-convert.js文件时,可能是多线程执行,因为什么原因导致了数据未隔离

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

// 首先在后端连入log,查看导出的耗时和大小,如果均一致说明数据未隔离
   .doOnNext(base64 -> log.info("【图表1】日期趋势图生成成功,base64长度: {}", base64 != null ? base64.length() : 0))
// ...后续的生成逻辑均使用log

// 查看发现果然都一样,此时本地联调没问题,拉下服务器的phantomjs和echarts-convert文件,对比本地环境,发现
服务器:
 var args = convert.serverGetArgs(request);
  if (args.opt !== undefined) {
      var check = convert.serverCheckAndSet(params, args);
      if (check) {
          convert.client(params, write);  // 传的是 params(全局共享)
      }
  }

本机:
 var reqParams = convert.serverGetArgs(request);
  if (reqParams.opt !== undefined) {
      var check = convert.serverCheckAndSet(params, reqParams);
      if (check) {
          convert.client(reqParams, write);  //  传的是 reqParams(每次请求独立)
      }
  }

对比发现新版本修复了多张echarts图导出的问题已经修复,主要是变量的作用域上。

• 此时去调试问题1图片重复问题已然得到解决,但还是没有任何文字,明确了前端是有传输对应配置的情况下,考虑以下思路:

• 查看是否有中文字体支持

fc-list :lang=zh

• 如果有,查看phantomjs和echarts-convert是否有冲突,按理说不可能有

• 大概率没有,服务器可能未安装中文字体,将本地的字体库安装,重启服务复测

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

# 打开 C:\Windows\Fonts\,找到以下字体文件并复制出来:
  - simhei.ttf (黑体)
  - simsun.ttc (宋体)
  - msyh.ttf 或 msyh.ttc (微软雅黑)

# 在服务器上安装字体

  # 创建字体目录
  mkdir -p /usr/share/fonts/chinese

  # 复制字体文件到该目录
  cp simhei.ttf simsun.ttc msyh.ttc /usr/share/fonts/chinese/

  # 设置权限
  chmod 644 /usr/share/fonts/chinese/*

  # 刷新字体缓存
  fc-cache -fv

  # 验证字体是否安装成功
  fc-list :lang=zh

# 重启服务

  # 杀掉 phantomjs 进程
  pkill -f phantomjs

  # 重启 Java 服务
  systemctl restart your-java-service
	

最终该问题得以解决