我试图单独运行 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的子进程(??)的子进程。
所以我的问题是,这个问题的解决方案(或解决方法)是什么?
干杯!
答案 0 :(得分:1)
问题是节点无法找到phantomjs
。如果执行节点脚本的用户不在$PATH
中,您可以尝试使用phantomjs
二进制文件的完整路径。您可能还想检查phantomjs
二进制文件的可执行权限。