首頁 > 後端開發 > php教程 > php如何呼叫phantomJS截圖

php如何呼叫phantomJS截圖

藏色散人
發布: 2023-04-09 16:32:01
轉載
4649 人瀏覽過

php如何呼叫phantomJS截圖

推薦:《PHP影片教學

#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(&#39;@runtime&#39;);
    }
    /**
     * 截图并上传
     * @param string $url
     * @param string $filename
     * @return string
     * @throws BizException
     */
    public function screenShotThenSaveToOss(string $url, string $filename = &#39;temp.jpg&#39;)
    {
        //输出图片的路径
        $outputFilePath = "{$this->temp_dir}/$filename";
        //执行的phantomjs命令
        //phantomjs 可执行文件必须是 绝对路径 否则导致 exec 函数返回值127错误
        $cmd = "\usr\local\bin\phantomjs {$this->js_path} &#39;$url&#39; &#39;$outputFilePath&#39;";
        //捕捉不到phantomjs命令输出结果
        exec($cmd, $output);
        //检查截图文件是否存在
        $isShotImgaeExist = file_exists($outputFilePath);
        if (!$isShotImgaeExist) {
            throw new BizException(0, &#39;phantomjs截图失败&#39;, 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 = &#39;raw_file_name&#39;;
        $file = new \CURLFile($screenshot_path, &#39;image/jpeg&#39;, &#39;file&#39;);
        $tokenArray = $this->getOssPolicyToken(&#39;fetch&#39;);
        $url = $tokenArray->host;
        $postData = [
            &#39;key&#39; => "{$tokenArray->dir}/$ossKey",
            &#39;policy&#39; => $tokenArray->policy,
            &#39;OSSAccessKeyId&#39; => $tokenArray->accessid,
            &#39;success_action_status&#39; => &#39;200&#39;,
            &#39;signature&#39; => $tokenArray->signature,
            &#39;callback&#39; => $tokenArray->callback,
            &#39;file&#39; => $file
        ];
        $ch = curl_init();
        //$data = array(&#39;name&#39; => &#39;Foo&#39;, &#39;file&#39; => &#39;@/home/user/test.png&#39;);
        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 &#39;&#39;;
        } else {
            return $res->data->url;
        }
    }
    /**
     * 调用管理后台阿里云oss token接口
     * @param null $url
     * @return array
     */
    public function getOssPolicyToken($url = null)
    {
        $url = \Yii::$app->params[&#39;oss_screen_shot_token_api&#39;];
        $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(&#39;system&#39;);
var webPage = require(&#39;webpage&#39;);
var page = webPage.create();
//设置phantomjs的浏览器user-agent
page.settings.userAgent = &#39;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&#39;;
//获取php exec 函数的命令行参数
if (system.args.length !== 3) {
    console.log(system.args);
    console.log(&#39;参数错误&#39;);
    console.log(&#39;第2个参数为url地址 第3个参数为截图文件名称&#39;);
    phantom.exit(1);
}
//命令行 截图网址参数
var url = system.args[1];
//图片输出路径
var filePath = system.args[2];
console.log(&#39;-------&#39;);
console.log(url);
console.log(&#39;-------&#39;);
console.log(filePath);
console.log(&#39;-------&#39;);
//设置浏览器视口
page.viewportSize = {width: 480, height: 960};
//打开网址
page.open(url, function start(status) {
    //1000ms之后开始截图
    setTimeout(function () {
        //截图格式为jpg 80%的图片质量
        page.render(filePath, {format: &#39;jpg&#39;, quality: &#39;80&#39;});
        console.log(&#39;success&#39;);
        //退出phantomjs 避免phantomjs导致内存泄露
        phantom.exit();
    }, 1000);
});
登入後複製

以上是php如何呼叫phantomJS截圖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:mojotv
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板