【发布时间】:2015-11-25 02:05:13
【问题描述】:
我正在尝试单独运行 PHP 代码。 php 代码只是使用所需的参数每隔一段时间调用一个节点脚本。另一方面,Node.js 脚本计算参数以从 mongoDb 获取额外数据,然后在其中生成一个子进程以调用 Phantomjs使用这些参数并创建热图图像文件。
现在,当使用正确的参数从命令行触发时,Node.js 脚本运行良好。
但是无论我尝试什么,当从 php 调用时,我都无法让它工作。
我尝试过 shell_exec 和 exec,如下所示:
$node = '/usr/local/bin/node';
$scriptPath = $this->basePath . '/web/scripts/node/heatmaps_node_wrapper.js';
$clickmapCmd = $node . ' ' . $scriptPath . ' ' . $url . ' ' . $groupId . ' ' . $heatmapId . ' click';
$mousemovemapCmd = $node . ' ' . $scriptPath . ' ' . $url . ' ' . $groupId . ' ' . $heatmapId . ' mousemove';
$asyncCmd = ' >' . $this->basePath . '/logs/heatmap.io.log 2>'. $this->basePath . '/logs/heatmap.err.log &';
exec($clickmapCmd . $asyncCmd);
exec($mousemovemapCmd . $asyncCmd);
也尝试过使用 symfony 的 ProcessBuilder 组件,就像这样 -
$builder = new ProcessBuilder();
$builder->setPrefix('/usr/local/bin/node');
$builder->setArguments(array($scriptPath, $url, $groupId, $heatmapId, 'click'));
$process = $builder->getProcess();
$process->setTimeout(1000);
$process->setIdleTimeout(1000);
$process->start();
$output = $process->getOutput();
两者都无法创建热图图像。
但是调试 symfony 代码和研究 symfony 的 Process 对象帮助我发现了可能的问题。在对象 stderr 我看到以下消息 -
events.js:85
throw er; // Unhandled 'error' event
^
Error: spawn phantomjs ENOENT
at exports._errnoException (util.js:746:11)
at Process.ChildProcess._handle.onexit (child_process.js:1053:32)
at child_process.js:1144:20
at process._tickCallback (node.js:355:11)
所以我的猜测是 Node 试图创建 PHP 子进程的子进程(??)。
所以我的问题是,这个问题的解决方案(或变通方法)是什么?
干杯!
【问题讨论】: