Как интегрировать PHP и R в Windows?


Возникли некоторые проблемы с интеграцией PHP и R. Я работаю над этой статьей:

Http://www.r-bloggers.com/integrating-php-and-r/

R установлен и проверен при работе с нашим скриптом R:

Rscript C:\inetpub\wwwroot\client\includes\decisionTreePredictor.R 20 10 O 1000 10000 5000 0.2 10.2

Печать одного значения, являющегося результатом его вычислений:

[1] "0"

(Путь к Rscript.exe задается в переменных среды Windows)

У меня есть PHP-скрипт, который использует exec(), который успешно тестируется с помощью команд такие как:

$result = exec('dir',$output,$returnVar);
echo "<br>result ". print_r($result,true);
echo "<br>output <pre>". print_r($output,true) , "</pre>";
echo "<br>return ". print_r($returnVar,true);

Возвращающийся:

result 2 Dir(s) 117,749,354,496 bytes free
output 
Array
(
    [0] =>  Volume in drive C is C_DRIVE
    [1] =>  Volume Serial Number is 7EB2-A074
    [2] => 
    [3] =>  Directory of C:\inetpub\wwwroot\client\temp
    [4] => 
    [5] => 05/17/2014  10:29 PM              .
    [6] => 05/17/2014  10:29 PM              ..
    [7] => 05/16/2014  09:24 AM             5,181 dbimporttest.php
    [8] => 05/17/2014  10:29 PM                 0 routput.txt
    [9] => 05/17/2014  11:42 PM               701 rscripttest.php
    [10] => 05/16/2014  04:59 PM               425 whoami.php
    [11] =>                4 File(s)          6,307 bytes
    [12] =>                2 Dir(s)  117,749,354,496 bytes free
)


return 0

Когда я пытаюсь запустить сценарий R в команде exec, это не удается:

$result = exec('Rscript.exe C:\inetpub\wwwroot\client\includes\decisionTreePredictor.R 20 10 O 1000 10000 5000 0.2 10.2',$output,$returnVar);
echo "<br>result ". print_r($result,true);
echo "<br>output <pre>". print_r($output,true) , "</pre>";
echo "<br>return ". print_r($returnVar,true);

Возвращающийся:

result 
output 
Array
(
)


return 1

Я бегу:

  • Windows Server 8 R2
  • IIS 8
  • PHP 5.5
  • R 3.1
Author: halfer, 2014-05-18

1 answers

Не удалось заставить exec() работать или выводить ошибки, которые можно использовать, я решил поискать альтернативный маршрут. Использование класса COM, похоже, дало мне то, что я искал.

Вот окончательный, рабочий код:

$command = 'C:\Program Files\R\R-3.1.0\bin\Rscript.exe C:\inetpub\wwwroot\client\includes\decisionTreePredictor.R 20 10 O 1000 10000 5000 0.2 10.2';
$pCom = new COM("WScript.Shell");
$pShell = $pCom->Exec($command);
$sStdOut = $pShell->StdOut->ReadAll;    # Standard output
$sStdErr = $pShell->StdErr->ReadAll;    # Error
echo "<pre>$sStdOut</pre>";

Странно, что я не смог заставить exec() выполнить эту работу, поскольку это, по-видимому, решение, предпочитаемое большинством блоггеров, обсуждающих интеграцию R/PHP.

В любом случае, я надеюсь, что это решение поможет всем, кто окажется в моей ситуации!

P.S. Ты нужно будет убедиться, что расширение включено в php.ini (по умолчанию оно отключено при установке): extension=php_com_dotnet.dll

 2
Author: mwex501, 2014-05-18 19:08:34