加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱制作网_潮州站长网 (http://www.0768zz.com/)- 物联安全、建站、操作系统、云计算、数据迁移!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php怎么调用phantomJS截图

发布时间:2022-07-21 12:50:02 所属栏目:PHP教程 来源:互联网
导读:php调用phantomJS截图 知识储备 *unix系统安装phantomjs,权限相关知识 基本JavaScript语法知识 php exec函数调用REPL phantomjs phantomjs js截图文档 http://javascript.ruanyifeng.com/tool/phantomjs.html 代码(php 代码环境为yii2框架) ?php namespace w
  php调用phantomJS截图
 
  知识储备
 
  *unix系统安装phantomjs,权限相关知识
 
  基本JavaScript语法知识
 
  php exec函数调用REPL phantomjs
 
  phantomjs js截图文档 http://javascript.ruanyifeng.com/tool/phantomjs.html
 
  代码(php 代码环境为yii2框架)
 
 
  <?php
 
  namespace weapplibraryphantomjs;
 
  use weapplibraryBizException;
 
  class ScreenShot
 
  {
 
      /** @var string 获取phantomjs 参数中 js文件的决定路径 */
 
      private $js_path;
 
      /** @var bool|string 获取php 有777权限的临时文件目录 */
 
      private $temp_dir;
 
      function __construct()
 
      {
 
          $dir = __DIR__;
 
          $this->js_path = "{$dir}/script.js";
 
          /** @var bool|string 获取php 有777权限的临时文件目录 */
 
          $this->temp_dir = Yii::getAlias('@runtime');
 
      }
 
      /**
 
       * 截图并上传
 
       * @param string $url
 
       * @param string $filename
 
       * @return string
 
       * @throws BizException
 
       */
 
      public function screenShotThenSaveToOss(string $url, string $filename = 'temp.jpg')
 
      {
 
          //输出图片的路径
 
          $outputFilePath = "{$this->temp_dir}/$filename";
 
          //执行的phantomjs命令
 
          //phantomjs 可执行文件必须是 绝对路径 否则导致 exec 函数返回值127错误
 
          $cmd = "usrlocalbinphantomjs {$this->js_path} '$url' '$outputFilePath'";
 
          //捕捉不到phantomjs命令输出结果
 
          exec($cmd, $output);
 
          //检查截图文件是否存在
 
          $isShotImgaeExist = file_exists($outputFilePath);
 
          if (!$isShotImgaeExist) {
 
              throw new BizException(0, 'phantomjs截图失败', BizException::SELF_DEFINE);
 
          }
 
          //保存截图到oss
 
          $result = $this->postScreenShotImageToOss($outputFilePath);
 
          //删除临时文件夹的截图图片
 
          unlink($outputFilePath);
 
          return $result;
 
      }
 
      /**
 
       * 上传截图到阿里云直传oss
 
       * @param string $screenshot_path
 
       * @return string
 
       */
 
      public function postScreenShotImageToOss(string $screenshot_path): string
 
      {
 
          $ossKey = 'raw_file_name';
 
          $file = new CURLFile($screenshot_path, 'image/jpeg', 'file');
 
          $tokenArray = $this->getOssPolicyToken('fetch');
 
          $url = $tokenArray->host;
 
          $postData = [
 
              'key' => "{$tokenArray->dir}/$ossKey",
 
              'policy' => $tokenArray->policy,
 
              'OSSAccessKeyId' => $tokenArray->accessid,
 
              'success_action_status' => '200',
 
              'signature' => $tokenArray->signature,
 
              'callback' => $tokenArray->callback,
 
              'file' => $file
 
          ];
 
          $ch = curl_init();
 
          //$data = array('name' => 'Foo', 'file' => '@/home/user/test.png');
 
          curl_setopt($ch, CURLOPT_URL, $url);
 
          // Disable SSL verification
 
          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 
          curl_setopt($ch, CURLOPT_POST, 1);
 
          curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); // required as of PHP 5.6.0
 
          curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
 
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
          curl_setopt($ch, CURLOPT_TIMEOUT, 20);
 
          curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
 
          //curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: $mime_type"]);
 
          $res = curl_exec($ch);
 
          $res = json_decode($res);
 
          curl_close($ch);
 
          if (empty($res) || $res->code != 0) {
 
              return '';
 
          } else {
 
              return $res->data->url;
 
          }
 
      }
 
      /**
 
       * 调用管理后台阿里云oss token接口
 
       * @param null $url
 
       * @return array
 
       */
 
      public function getOssPolicyToken($url = null)
 
      {
 
          $url = Yii::$app->params['oss_screen_shot_token_api'];
 
          $ch = curl_init();
 
          // Disable SSL verification
 
          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 
          // Will return the response, if false it print the response
 
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
          // Set the url
 
          curl_setopt($ch, CURLOPT_URL, $url);
 
          // Execute
 
          $result = curl_exec($ch);
 
          // Closing
 
          curl_close($ch);
 
          $res = json_decode($result);
 
          if (empty($res) || $res->code != 0) {
 
              return [];
 
          } else {
 
              return $res->data;
 
          }
 
      }
 
  }
 
  phantomjs javascript脚本内容
 
  "use strict";
 
  var system = require('system');
 
  var webPage = require('webpage');
 
  var page = webPage.create();
 
  //设置phantomjs的浏览器user-agent
 
  page.settings.userAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1';
 
  //获取php exec 函数的命令行参数
 
  if (system.args.length !== 3) {
 
      console.log(system.args);
 
      console.log('参数错误');
 
      console.log('第2个参数为url地址 第3个参数为截图文件名称');
 
      phantom.exit(1);
 
  }
 
  //命令行 截图网址参数
 
  var url = system.args[1];
 
  //图片输出路径
 
  var filePath = system.args[2];
 
  console.log('-------');
 
  console.log(url);
 
  console.log('-------');
 
  console.log(filePath);
 
  console.log('-------');
 
  //设置浏览器视口
 
  page.viewportSize = {width: 480, height: 960};
 
  //打开网址
 
  page.open(url, function start(status) {
 
      //1000ms之后开始截图
 
      setTimeout(function () {
 
          //截图格式为jpg 80%的图片质量
 
          page.render(filePath, {format: 'jpg', quality: '80'});
 
          console.log('success');
 
          //退出phantomjs 避免phantomjs导致内存泄露
 
          phantom.exit();
 
      }, 1000);
 
  });

(编辑:我爱制作网_潮州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读