Имея некоторые проблемы, интегрирующие 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
Я бегаю:
Невозможно заставить 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.
Во всяком случае, я надеюсь, что это решение поможет любому, кто окажется в моей ситуации!
PS Вам нужно убедиться, что расширение включено в php.ini (по умолчанию оно установлено при установке): extension = php_com_dotnet.dll