代码之家  ›  专栏  ›  技术社区  ›  Js Lim

php shell\u exec不使用Puppeter

  •  0
  • Js Lim  · 技术社区  · 7 年前
    • Web服务器:nginx
    • PHP框架:Laravel 5.5
    • 要生成PDF的库: puppeteer

    所以我想做的是,当用户点击 下载 按钮,则服务器将执行以下操作:

    1. 使用内容构建HTML文件
    2. 运行以下代码

    Laravel控制器

    $shell_output = shell_exec('`which node` ' . base_path('bin/export.js') . ' ' . $html_file . ' ' . $pdf_file . ' A4');
    print($shell_output); // <------- empty output
    
    $workable_output = shell_exec('echo `which node`');
    print($shell_output); // <------- THIS IS SHOWING "/usr/local/bin/node"
    

    这个 出口js公司 所容纳之物

    const puppeteer = require('puppeteer');
    
    var filename = process.argv[2];
    var output = process.argv[3];
    
    (async () => {
      const browser = await puppeteer.launch();
      const page = await browser.newPage();
      await page.setViewport({ width: 1000, height: 1415 });
      await page.goto('file://' + filename, { waitUntil: 'networkidle2' });
      await page.emulateMedia('print');
      await page.pdf({
        path: output,
        format: 'A4',
        printBackground: true,
        landscape: false,
        margin: {
          top: '60px',
          right: '20px',
          bottom: '30px',
          left: '20px'
        }
      });
    
      await browser.close();
    })();
    

    但问题是,没有生成PDF文件 $shell_output 也为空。

    然后我尝试在终端中运行shell命令,它工作得很好。i、 e。

    $ `which node` export.js content.html content.pdf A4
    

    同样,我尝试创建一个php文件,并使用php cli运行,即。

    $ php test.php
    

    的内容 测验php 如下所示

    <?php
    $shell_output = shell_exec('env DEBUG="puppeteer:*" `which node` export.js content.html content.pdf A4');
    echo $shell_output;
    

    服务器日志

    /var/log/nginx/error。日志

    2018/03/13 10:37:05 [error] 13017#13017: send() failed (111: Connection refused) while resolving, resolver: 127.0.0.1:53
    

    附言:我是AWS EC2的主持人。当我在本地机器上运行时,这没有问题。

    更新日期:2018年3月14日下午14:55(UTC+8)

    我试着把代码放到Laravel的tests文件夹中

    /测试/单元/示例测试。php

    $shell_output = shell_exec('`which node` ' . base_path('bin/export.js') . ' ' . $html_file . ' ' . $pdf_file . ' A4');
    

    并与一起运行 ubuntu 用户,它起作用了

    ubuntu@ip-xxx-xx-xx-xx:/var/www/project$ ./vendor/phpunit/phpunit/phpunit --filter ExampleTest
    PHPUnit 6.3.0 by Sebastian Bergmann and contributors.
    
    .
    .                                                                  2 / 2 (100%)
    
    Time: 4.82 seconds, Memory: 14.00MB
    

    但是,当我试着 www数据 用户,失败

    ubuntu@ip-xxx-xx-xx-xx:/var/www/project$ sudo -u www-data ./vendor/phpunit/phpunit/phpunit --filter ExampleTest
    PHPUnit 6.3.0 by Sebastian Bergmann and contributors.
    
    .(node:7991) UnhandledPromiseRejectionWarning: Error: spawn EACCES
        at ChildProcess.spawn (internal/child_process.js:330:11)
        at Object.exports.spawn (child_process.js:500:9)
        at Function.launch (/var/www/project/node_modules/puppeteer/lib/Launcher.js:106:40)
        at <anonymous>
    (node:7991) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
    (node:7991) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
    .                                                                  2 / 2 (100%)
    
    Time: 276 ms, Memory: 14.00MB
    
    OK (2 tests, 2 assertions)
    

    知道问题出在哪里吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Js Lim    7 年前

    我发现问题是由 chrome 可执行文件本身

    解决者

    $ chmod 777 /var/www/project/node_modules/puppeteer/.local-chromium/linux-536395/chrome-linux/*
    

    从中找到此 GitHub issue