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

时间:2013-10-16 15:47:06

标签: php sql r

解决方案:我只是想了解一下如何解决这个问题。虽然我可以直接在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()之后的所有内容。“

1 个答案:

答案 0 :(得分:2)

我相信您遇到的问题与我从PHP运行R脚本时遇到的问题相同。首先,确保从PHP调用R时,您可以这样做:

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

注意“2&gt;&amp; 1” - 这允许PHP收集$ output中出现的任何错误 - 否则它们会丢失。然后,您可以使用print_r($output)打印出$ output以查看由R生成的任何反馈/错误。这应该提供一些关于运行脚本时失败的线索。

我认为发生的事情是对'library(ODBC)'的调用失败了。我不确定为什么,但是当我从PHP调用时,它也似乎总是失败。要修复它,在我的R脚本中我改为:

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

lib.loc告诉R确切地找到ODBC库的位置。这应该可以解决问题。

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