PHP exec(节点)仅为-v运行,但不为.js文件运行

PHP exec(节点)仅为-v运行,但不为.js文件运行,php,node.js,exec,Php,Node.js,Exec,AWS中的Ubuntu18VM。 $return = exec("node -v", $o, $e); var_dump($retu); var_dump($o); var_dump($e); 输出: 字符串(8)“v10.16.3”数组(1){[0]=>string(8)“v10.16.3”}int(0) 因此节点安装正确 exec能够获取节点版本 但是,$return=exec(“node/var/www/savePdf.js someUrl someName”,$o,$e)不工作 输出:

AWS中的Ubuntu18VM。

$return = exec("node -v", $o, $e);
var_dump($retu);
var_dump($o);
var_dump($e);
输出:

字符串(8)“v10.16.3”数组(1){[0]=>string(8)“v10.16.3”}int(0)

  • 因此节点安装正确
  • exec能够获取节点版本
  • 但是,
    $return=exec(“node/var/www/savePdf.js someUrl someName”,$o,$e)不工作

    输出:

    字符串(0)“”数组(0){}int(1)

    node/var/www/savePdf.js someUrl someName
    正在终端中工作,生成PDF文件并正确保存如何解决这个问题?

    输出为
    nt authority\system

    var/www-R
    www-data
    所有

    在研究一些教程时,我在sudoers文件中添加了以下几行(忽略其中提到的有关安全性的警告,以便我可以sudo exec命令)

    $return=exec(“sudo node/var/www/savePdf.js someUrl someName”,$o,$e);//无差异

    savePdf.js包含用于从URL生成PDF的
    GoogleChrome/Puppeter
    代码,如下所示:

    'use strict';
    const puppeteer = require('/var/www/mysitename/public_html/node_modules/puppeteer');
    const url = process.argv[2], name = process.argv[3];
    
    (async() => {
        const browser = await puppeteer.launch(
            {
                executablePath: '/usr/bin/google-chrome',
                args: ['--no-sandbox', '--disable-setuid-sandbox']}
            );
        const page = await browser.newPage();
        await page.goto(url, {waitUntil: 'networkidle2'});
        await page.pdf({
            path: '/var/www/mysitename/public_html/resources/logs/'+name+'.pdf',
            format: 'A4',
            printBackground: true,
            margin: {
                top: "1cm",
                bottom: "1cm",
                left: "1cm",
                right: "1cm",
            }
        });
        await browser.close();
    })();
    
    因为
    exec()
    不会等待脚本完成执行

    您需要执行以下命令才能让
    exec()
    等待

     $return = exec("node /var/www/savePdf.js someUrl someName  > /dev/null &", $o, $e);
    
    注意

    php函数exec()仅返回结果的最后一行,而shell\u exec()返回完整结果

    参考

    感谢的回答

    在这种情况下,添加
    >/dev/null&
    将起作用

    exec("node /var/www/savePdf.js someUrl someName > /dev/null &", $o, $e);
    

    注意:从终端和PHP尝试时,脚本生成和保存PDF所用的时间不同。

    好的,因此我将代码更改为
    $return=shell\u exec(“node/var/www/savePdf.js someUrl soneName>/dev/null&;”
    返回的$return为空。PDF文件未保存
    exec
    将结果输出为
    string(0)“”数组(0){}int(0)
    在exec和shell\u exec中都没有保存PDF文件。在没有phpI的情况下直接执行
    node/var/www/savePdf.js someUrl someName
    时,您会得到什么输出?尝试将
    /var/www/mysitename/public\u html/resources/logs
    的文件夹权限设置为777并选中。js文件不会输出任何内容。它只接受两个参数,第一个是URL,第二个是名称。它在headless模式下使用Chrome,生成URL的PDF,并将其保存在JS中的name.PDF文件夹中。您能使用
    console.log
    try&catch
    跟踪运行时错误吗?@Banujan,非常感谢!添加
    /dev/null&
    后,它已修复。但是,与终端相比,从exex/shell_exec调用生成PDF需要3到4倍的时间。太棒了!,祝你好运