从 PHP 调用时 R 脚本未完成执行 - 尝试运行 RODBC 的 sqlQuery 函数时停止


R script not completing execution when called from PHP - stops when trying to run RODBC's sqlQuery function

>解决方案:我只是想更新一下如何解决这个问题。虽然我可以直接在 R 控制台中查询 SQL,但 PHP 没有与 SQL Server 的连接,一旦它命中 R 的 sqlQuery(),就会停止在 R 中运行我的脚本。在 PHP 中使用 sqlsrv_connect() 建立连接并在连接字符串中显式声明 SQL Server 身份验证凭据后,我能够使其正常工作。

"我正在尝试从PHP执行一个R脚本,该脚本应该运行一个存储过程,该存储过程将更新SQL Server 2005数据库中的表。我添加了一些 print() 行以查看脚本停止运行的位置,它将执行所有内容,直到 sqlQuery 函数。但是,当我在 R 控制台中运行它时,这工作正常。我的 R 脚本如下:

args <- commandArgs(TRUE)
X <- args[1]
sink("test.txt")
library(RODBC)
conn<-odbcDriverConnect('driver={SQL SERVER};server=server;database=database;trusted_connection=true')
print(conn)
print(X)
sqlQuery(conn,paste("EXEC sp.usp_Stored_Procedure @Test='",X,"', @Test2='Y', @Test3='Z'",sep=""))
print(X)

当我通过 PHP 传递参数"bread"时,R 脚本将运行并使用以下值创建"test.txt"文件:

[1] -1[1] "面包"

所以我至少知道连接已经建立并且它一直执行到 sqlQuery()。同样,这直接在 R 控制台中运行完全正常,所以我想知道当我尝试从 PHP 执行 R 脚本时它在哪里丢失。我正在运行 Windows 7,并使用 Windows 身份验证连接到 SQL Server。

编辑:这是PHP脚本:

echo "<form action='rfile.php' method='get'>";
echo "Enter name: <input type='text' name='X' />";
echo "<input type='submit' />";
echo "</form>";
if(isset($_GET['X']))
{
  $X = $_GET['X'];
  exec("C:'wamp'www'R'R-2.15.2'bin'Rscript em.R $X");
  $indsc = file_get_contents('test.txt');
  echo $indsc;
}
?>

在前端执行时,$indsc 返回 'test.txt' 文件的值,但 R 脚本中 sqlQuery() 之后的所有内容除外。

我相信

您遇到了与我从 PHP 运行 R 脚本时相同的问题。首先,确保从 PHP 调用 R 时以这种方式执行此操作:

exec('"C:'Program Files'R'R-3.0.1'bin'Rscript.exe" "myrscript.r" 2>&1', $output);

请注意"2>&1" - 这允许 PHP 收集$output中发生的任何错误 - 否则它们将丢失。然后,可以使用print_r($output)打印出$ouput,以查看 R 生成的任何反馈/错误。这应该提供有关运行脚本时失败的内容的一些线索。

我认为正在发生的事情是对"库(ODBC)"的调用失败。我不确定为什么,但是当我从 PHP 调用时,当我这样做时,它似乎总是失败。为了修复它,在我的 R 脚本中,我这样做了:

library(ODBC, lib.loc = "path/to/r/library/root/folder")

lib.loc 告诉 R 在何处可以找到 ODBC 库。这应该可以解决问题。

附言在我的系统上,R 库根文件夹的路径是"C:/users/myusername/Documents/R/win-library/3.0"。