php如何调用phantomJS截图

php如何调用phantomJS截图

php调用phantomJS截图

  • 知识储备

*unix系统安装phantomjs,权限相关知识

基本JavaScript语法知识

php exec函数调用REPL phantomjs

phantomjs js截图文档 http://javascript.ruanyifeng.com/tool/phantomjs.html

  • 代码(php 代码环境为yii2框架)

<?php
namespace weapp\\library\\phantomjs;
use weapp\\library\\BizException;
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 = "\\usr\\local\\bin\\phantomjs {$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);
});

关于php如何调用phantomJS截图的文章就分享到这,如果对你有帮助欢迎继续关注我们哦

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/41821.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
php学习php学习订阅用户
上一篇 2022年6月23日 16:31
下一篇 2022年6月23日 16:31

相关推荐

  • 详解php实现网页上一页下一页翻页过程

    前言这几天做项目因为数据太多,需要对信息进行上下翻页展示,就自己写了翻页的代码大致功能就是页面只显示几条信息,按上一页、下一页切换内容,当显示第一页时上一页和首页选项不可选,当页面加载到最后一页时下…

    2022年6月14日
    0379
  • PHP实现代码复用的traits新特性的方法

    在阅读yii2源码的时候接触到了trait,就学习了一下,写下博客记录一下。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少…

    2022年6月12日
    0127
  • PHP8.0中的国际化库

    PHP8.0中的国际化库:Unicode CLDR和Intl扩展随着全球化的进程,开发跨语言、跨地域的应用程序变得越来越普遍。国际化是实现这一目标的重要组成部分。在 PHP 8.0 中,引入了Unicode CLDR和Intl扩展,这两个组件都为…

    2023年5月19日
    08
  • PHP中如何进行Kubernetes技术的应用?

    随着云计算和容器化技术的飞速发展,Kubernetes已成为当今最主流的云原生应用程序管理平台。在Kubernetes的世界里,PHP这样的Web编程语言也能够轻松地进行应用。本文将介绍如何在PHP应用中使用Kubernetes技术,让你…

    2023年5月17日
    06
  • PHP中的功能测试框架。

    随着软件项目的不断增多,开发人员经常会遇到各种的问题。其中最让人头痛的问题之一就是,如何保证项目代码的质量和稳定性。为此,很多开发人员都开始采用各种测试框架来测试他们的代码是否达到了预期的要求。在这…

    2023年5月30日
    02
  • 如何使用PHP进行面向对象编程?

    随着互联网不断发展,PHP成为了广受欢迎的服务器端语言。很多开发者选择使用PHP进行开发,因为它易于学习和使用。然而,使用PHP进行面向对象编程可能会有些困难。在本篇文章中,我们将介绍如何使用PHP进行面向对象…

    2023年5月17日
    05
  • 小编教你学php什么时候学二次开发比较好。

    学习PHP二次开发的最佳时机 在当今这个高度信息化的社会,互联网已经成为了我们生活中不可或缺的一部分,而作为互联网的基石,Web开发技术也变得越来越重要,PHP作为一种广泛应用的服务器端脚本语言,因其简单易学…

    2024年7月3日
    01
  • PHP实现MySQL数据库主从复制的方法。

    随着互联网的飞速发展,Web应用程序越来越多地集成了数据库操作。MySQL作为一款世界知名的关系型数据库系统,使用广泛。在高并发的Web应用中,MySQL主从复制是一种提高数据库性能和可用性的重要方式。本文将介绍如…

    2023年5月21日
    01

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息