PHP exec(节点)仅为-v运行,但不为.js文件运行
AWS中的Ubuntu18VM。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)不工作 输出:
$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)
$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倍的时间。太棒了!,祝你好运