首頁 > 後端開發 > php教程 > 關於php如何呼叫phantomjs給微信小程式分享的問題

關於php如何呼叫phantomjs給微信小程式分享的問題

不言
發布: 2023-04-02 22:18:02
原創
2086 人瀏覽過

這篇文章主要介紹了關於php如何呼叫phantomjs給微信小程式分享的問題,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

背景

  • CTO不讓我使用golang所以只好用php呼叫phantomjs

  • packagist上的composer套件功能很冗餘,我只需要用到phantomjs的截圖功能

知識儲備

  • *unix系統安裝phantomjs,權限相關知識

  • 基本JavaScript語法知識

  • php exec函數呼叫REPL phantomjs

  • phantomjs js截圖文檔http://javascript.ruanyifeng....

#程式碼(php 程式碼環境為yii2框架)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

<?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腳本內容

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

"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目錄架構

關於php如何呼叫phantomjs給微信小程式分享的問題

以上就是本文的全部內容,希望對大家的學習有幫助,更多相關內容請關注PHP中文網!

相關推薦:

以上是關於php如何呼叫phantomjs給微信小程式分享的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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