【问题标题】:Executing R script from PHP从 PHP 执行 R 脚本
【发布时间】:2017-09-09 00:43:50
【问题描述】:

index.php:

<?php
    echo exec("Rscript foo.R");
?>

foo.R

#!/usr/bin/env Rscript
print("Before!")
#library(rJava);
print("After!");

网页输出:

[1] "After!"

现在这是一个预期的输出,因为exec 返回命令结果的最后一行。 现在因为我想访问需要rJavaRMongo库的mongodb数据库,所以我稍微修改了上面的代码。

foo.R

#!/usr/bin/env Rscript
print("Before!")
library(rJava);
print("After!");

网页输出:

[1] "Before!"

现在我不明白这个输出。我期望与以前相同的输出,即[1] "After!"。就好像从库导入行开始的 R 代码根本不存在。我已经在R shell 中测试了上面的代码(以及我在从mongodb 抓取的数据上使用kmeans 的省略的代码),它按预期工作。

R 脚本中导入库有什么问题,该脚本应该从 PHP 执行?


更新 1
有趣的是,如果我从命令行调用index.php,修改后的foo.R 会按照我的预期被调用和执行。

$ php index.php 
Loading required package: methods
[1] "After!"

所以我的结论是我的普通用户帐户可以执行index.php,这反过来可以在foo.R 中加载库,但似乎www-data 用户帐户没有权限在R 中加载库。

所以现在的问题是如何授予www-data 加载R 库的权限?


更新 2
我通过将 apache 用户从 www-data 更改为我当前的用户暂时解决了这个问题,但我知道这是一个巨大的安全风险,我正在寻找替代解决方案。

【问题讨论】:

  • www-user 无法加载R 库时,您是否准确检查过您在Apache 日志中遇到的错误?特别是,我认为您需要找到那些 R 库所在的位置。
  • 另一种可能是用户www-data 的库搜索路径不正确,而不是权限问题。这些库是在系统范围内安装的,还是为您的本地用户安装的?
  • @merlin2011 哦!我觉得是后者!现在我记得我已经在我的主目录中安装了库。我现在将在系统范围内安装它们,并尝试使用默认的 apache 用户。请将此作为答案发布,以便我可以接受它是否有效:)

标签: php r user-permissions


【解决方案1】:

首先,当 www-user 无法加载 R 库时,您应该准确检查 Apache 日志中出现的错误。两个最可能的罪魁祸首是权限错误和不正确的库搜索路径。

如果库是为本地用户而不是系统范围安装的,那么www-data 将无法找到它们,但 Apache 日志中的错误应该会显示此信息。

【讨论】:

    【解决方案2】:

    另一种选择可能是您不使用 PHP 直接执行 R 脚本。

    您可以使用像Redis 这样的键值数据库或像Rabbitmq 这样的排队系统。与其直接执行脚本,不如向这些系统中的任何一个发送消息。

    在命令行中执行一个 php 脚本,轮询这些系统中的任何一个以查找任何新消息,当它收到消息时,它会执行脚本并以脚本的结果作为响应。

    所以它会变成一个双向的消息系统:

    Script A ----> Queue ----> Script B  ----> R Script
    R Script --result--> Script B ----> Queue ----> Script A
    

    这是一个最初实施的系统有点复杂,但绝对安全且可扩展。

    我建议你看看Celery

    【讨论】:

      最近更新 更多