如何在php中生成一个新进程来调用需要子进程的节点脚本

时间:2015-08-31 05:24:26

标签: php node.js symfony

我试图单独运行 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的子进程(??)的子进程。

所以我的问题是,这个问题的解决方案(或解决方法)是什么?

干杯!

1 个答案:

答案 0 :(得分:1)

问题是节点无法找到phantomjs。如果执行节点脚本的用户不在$PATH中,您可以尝试使用phantomjs二进制文件的完整路径。您可能还想检查phantomjs二进制文件的可执行权限。