【问题标题】:How to spawn a new process in php to call a node script that requires a child process如何在 php 中生成一个新进程来调用需要子进程的节点脚本
【发布时间】: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 子进程的子进程(??)。

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

干杯!

【问题讨论】:

    标签: php node.js symfony


    【解决方案1】:

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

    【讨论】:

    • 嗯,奇怪的是 phantomjs 在$PATH 中,并且可以在从控制台调用时执行,但是当我确实更改了 js 脚本以具有 phantomjs 的完整路径时,它停止产生错误。但图像仍未创建。知道为什么吗??
    • 如果您的 PHP 脚本通过 Apache、php-fpm 或类似工具运行,那么您从控制台执行它的用户很可能与您的 PHP 脚本正在执行的用户不同(例如,Apache 通常使用apachewww-data 用户)。
    • 是的,在文件夹上设置权限也解决了该问题。谢谢:)
    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2010-11-01
    相关资源
    最近更新 更多