• 技术文章 >后端开发 >php教程

    php调用phantomjs给微信小程序分享

    不言不言2018-07-06 16:41:14原创1184
    这篇文章主要介绍了关于php调用phantomjs给微信小程序分享,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

    知识储备

    代码(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目录结构

    3184207835-5b28e6f5859bb_articlex[1].png

    php入门到就业线上直播课:进入学习

    以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

    相关推荐:

    Laravel微信小程序获取用户详细信息及带参数小程序码扩展的分析

    gitbash PHP执行输出中文乱编解决方式

    php的快速排序的代码

    以上就是php调用phantomjs给微信小程序分享的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    上一篇:使用RoadRunner 加速 Laravel 应用 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 你知道如何用PHP实现多进程吗• 求解:phpcms模板怎样转码?该怎么解决• php怎的快捷知道某个函数在哪个文件用过• CI框架源码阅览-Model.php • 这个网站有源程序吗?高手一上,拜谢
    1/1

    PHP中文网