【发布时间】: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)
- 所以节点安装正确。
- 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 -R 归 www-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.log和try & catch来跟踪运行时错误吗? -
@Banujan,非常感谢!添加
> /dev/null &后修复。但是,与终端相比,从 exex/shell_exec 调用时生成 PDF 需要 3 到 4 倍。