2

解决方案:我只是想提供有关如何解决此问题的更新。虽然我可以直接在 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 传递参数“面包”时,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() 之后的所有内容除外。”

4

1 回答 1

2

我相信您遇到的问题与我从 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 中——否则它们会丢失。然后,您可以打印出 $ouput usingprint_r($output)以查看 R 产生的任何反馈/错误。这应该提供一些线索,说明您在运行脚本时失败的原因。

我认为正在发生的事情是对“库(ODBC)”的调用失败了。我不知道为什么,但是当我从 PHP 调用时,当我这样做时,它似乎总是失败。为了解决这个问题,我在我的 R 脚本中这样做了:

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

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

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

于 2013-10-16T16:13:57.137 回答