2017-04-13 5 views
0

index.php:Ausführen von R-Skript von PHP

<?php 
    echo exec("Rscript foo.R"); 
?> 

foo.R:

#!/usr/bin/env Rscript 
print("Before!") 
#library(rJava); 
print("After!"); 

Ausgabe auf der Webseite:

[1] "After!" 

Nun ist dies eine erwartete Ausgabe als exec die letzte Zeile kehrt aus das Ergebnis des Befehls. Jetzt, da ich auf die mongodb-Datenbank zugreifen möchte, die rJava und RMongo Bibliotheken benötigt, habe ich den obigen Code ein wenig geändert.

foo.R:

#!/usr/bin/env Rscript 
print("Before!") 
library(rJava); 
print("After!"); 

Ausgabe auf der Webseite:

[1] "Before!" 

nun diese Ausgabe Ich verstehe nicht. Ich erwartete die gleiche Ausgabe wie zuvor, d.h. [1] "After!". Es ist so, als ob der R-Code, der von der Bibliotheks-Importlinie ausgeht, überhaupt nicht existiert. Ich habe den obigen Code (und den ausgelassenen, wo ich kmeans auf die Daten von mongodb greifen) in R shell verwendet und es funktioniert wie erwartet.

Was ist falsch beim Importieren einer Bibliothek in einem R Skript, das von PHP ausgeführt werden soll?


Update 1:
Interessanterweise wird die modifizierte foo.R aufgerufen und nach meiner Erwartung ausgeführt, wenn ich index.php von der Kommandozeile aufrufen.

$ php index.php 
Loading required package: methods 
[1] "After!" 

Also mein Fazit ist, dass mein normales Benutzerkonto index.php ausführen kann, die in foo.R Bibliotheken wiederum laden können, aber es scheint www-data Benutzerkonto keine Berechtigungen hat Bibliotheken in R zu laden.

Jetzt ist die Frage, wie gebe ich Berechtigungen www-data zu laden R Bibliotheken?


Update 2:
löste ich dieses Problem vorübergehend von Apache-Benutzer zu meinem aktuellen Benutzer von www-data ändern, aber ich bin mir bewusst, das ein enormes Sicherheitsrisiko ist, und ich bin für eine alternative Lösung.

+0

Haben Sie genau überprüft, welchen Fehler Sie in Ihren Apache-Protokollen erhalten, wenn 'www-user'' R'-Bibliotheken nicht laden kann? Insbesondere denke ich, dass Sie herausfinden müssen, wo diese R-Bibliotheken leben. – merlin2011

+0

Die andere Möglichkeit ist, dass der Bibliothekssuchpfad für den Benutzer "www-data" nicht korrekt ist, sondern ein Berechtigungsproblem. Sind die Bibliotheken systemweit installiert oder wurden sie für Ihren lokalen Benutzer installiert? – merlin2011

+0

@ merlin2011 Oh! Ich denke, es ist der spätere! Jetzt erinnere ich mich daran, dass ich Bibliotheken in meinem Home-Verzeichnis installiert habe. Ich werde sie jetzt systemweit installieren und werde mit dem Standard-Apache-Benutzer versuchen. Bitte posten Sie dies als Antwort, damit ich akzeptieren kann, wenn es funktioniert :) – rootkea

Antwort

3

Zuerst sollten Sie genau prüfen, welchen Fehler Sie in Ihren Apache-Protokollen erhalten, wenn www-Benutzer R-Bibliotheken nicht laden können. Die zwei wahrscheinlichsten Täter sind ein Berechtigungsfehler und ein falscher Bibliothekssuchpfad.

Wenn die Bibliotheken für den lokalen Benutzer anstelle von systemweit installiert werden, kann www-data sie nicht finden, aber die Fehler in den Apache-Protokollen sollten diese Informationen offen legen.

0

Eine andere Alternative könnte sein, dass Sie PHP nicht verwenden, um das R-Skript direkt auszuführen.

Sie können eine Schlüsselwertdatenbank wie Redis oder ein Warteschlangensystem wie Rabbitmq verwenden. Anstatt das Skript direkt auszuführen, senden Sie eine Nachricht an eines dieser Systeme.

Führen Sie ein PHP-Skript in der Befehlszeile aus, das eines dieser Systeme abfragt, um nach neuen Nachrichten zu suchen, und wenn es die Nachricht erhält, führt es das Skript aus und antwortet mit dem Ergebnis aus dem Skript.

So wird es ein Zwei-Wege-Messaging-System werden:

Script A ----> Queue ----> Script B ----> R Script 
R Script --result--> Script B ----> Queue ----> Script A 

Das ist ein bisschen kompliziert System zunächst zu implementieren, aber auf jeden Fall sicher und skalierbar.

Ich würde vorschlagen, dass Sie sich Celery ansehen.

Verwandte Themen