【问题标题】:PHP exec(node) running only for -v but not for .js filePHP exec(node) 只为 -v 运行,但不为 .js 文件运行
【发布时间】:2020-03-18 09:31:08
【问题描述】:

AWS 中的 Ubuntu 18 虚拟机。

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

输出:

string(8) "v10.16.3" array(1) { [0]=> string(8) "v10.16.3" } int(0)

  1. 所以节点安装正确。
  2. exec 能够获取节点版本。

但是,$return = exec("node /var/www/savePdf.js someUrl someName", $o, $e); 不起作用。

输出:

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

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

<?php echo exec('whoami'); ?> 输出为nt authority\system

var/www -Rwww-data 所有。

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

$return = exec("sudo node /var/www/savePdf.js someUrl someName", $o, $e); // no difference

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

'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();
})();

【问题讨论】:

  • 在你的 JS 中。可以使用console.logtry & catch 来跟踪运行时错误吗?
  • @Banujan,非常感谢!添加> /dev/null &后修复。但是,与终端相比,从 exex/shell_exec 调用时生成 PDF 需要 3 到 4 倍。

标签: php node.js exec


【解决方案1】:

因为exec() 不会等到您的脚本完成执行,

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

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

注意

php函数exec()只返回结果的最后一行,而shell_exec()返回完整的结果。

参考

https://www.geeksforgeeks.org/php-shell_exec-vs-exec-function/

https://subinsb.com/how-to-execute-command-without-waiting-for-it-to-finish-in-php/

【讨论】:

  • 好的,所以我将代码更改为$return = shell_exec("node /var/www/savePdf.js someUrl soneName > /dev/null &"); $return 为 NULL。 PDF 文件未保存。 exec 输出结果为string(0) "" array(0) {} int(0)
  • 在 exec 和 shell_exec 中,PDF 文件都没有被保存。
  • 不使用php直接执行node /var/www/savePdf.js someUrl someName会得到什么输出
  • 我尝试将 /var/www/mysitename/public_html/resources/logs 的文件夹权限设置为 777 并进行了检查。
  • JS文件不会输出任何东西。它只接受 2 个参数,第一个是 URL,第二个是名称。它以无头模式使用 Chrome,生成 URL 的 PDF 并以 name.pdf 格式保存在文件夹中。
【解决方案2】:

感谢 Banujan Balendrakumar 的回答。

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

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

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

【讨论】:

  • 太好了!祝你好运!
猜你喜欢
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2021-07-30
相关资源
最近更新 更多