解决方案:我只是想提供有关如何修复此问题的最新信息。虽然我可以直接在 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”。
关于php - 从 PHP 调用时,R 脚本未完成执行 - 尝试运行 RODBC 的 sqlQuery 函数时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19407924/