8 votes

Comment exécuter une commande shell via un code PHP ?

J'essaie d'exécuter un fichier Jar dans le backend de mon code php, mais je n'obtiens pas le résultat souhaité. Il y a un fichier Jar qui fonctionne en arrière-plan et renvoie le Page Rank de n'importe quel mot-clé et domaine qui lui est donné. Je joins le code, s'il vous plaît suggérez-moi une solution, car lorsque je l'exécute sur le terminal, il donne une sortie correcte.

Voici le code :

    <?php
set_time_limit(0);
function returnJarPath()
{
    $jarPath = $_SERVER['DOCUMENT_ROOT'] . "myFolder/tools_new/includes/Rank.jar";
    return $jarPath;
}
$jar = returnJarPath();
$command = "java -jar $jar aspdotnet/microsoft.com";//Passing the Argument to the Jar file.

$shellOutput = shell_exec($command);
    print "The Shell Output is : " ; var_dump($shellOutput);print "<br />";
exec($command,$executeCommmand);
    print "The Exec returns the value : " ; var_dump($executeCommmand);print "<br />";
passthru($command,$passthruCommand);
    print "The Passthru returns the value : " . $passthruCommand. "<br />";
?>

Je viens de vérifier le journal des erreurs d'Apache et la dernière erreur que j'ai trouvée était :

sh : java : commande non trouvée

Mais comme je l'ai déjà dit, j'ai utilisé la même commande via SSH pour exécuter la commande Java. Il n'y a donc aucune possibilité que JAVA ne soit pas installé sur le serveur. S'il vous plaît, aidez-moi à sortir de ce pétrin...

3voto

darpet Points 1198

Si le fichier jar écrit sur la sortie standard, vous pouvez utiliser exec.

Voici un exemple de la façon dont je l'utilise :

may be first: exec("cd jar dir"); // if jar fine needs to be executed from the same dir
$output = exec("/usr/bin/java -jar $jar aspdotnet/microsoft.com");

Mais comme vous le dites :

sh: java: command not found

Cela signifie qu'il n'y a pas d'alias de chemin vers java depuis php. Il suffit d'utiliser le chemin complet de l'exécutable /usr/bin/java.

0voto

Brad F Jacobs Points 12725

Étant donné que vous appelez java . Je parie que la sortie est affichée dans la console Java, et non dans le shell, où PHP pourrait extraire les informations du texte.

Comment résoudre ce dilemme ?

Vous pourriez écrire les résultats dans un fichier, si vous avez la source java à modifier, et ensuite lire ce fichier à travers php pour obtenir les résultats. La possibilité d'une collision ici serait assez bonne. L'autre option consiste à faire en sorte que Java se connecte à votre base de données MySQL (si vous en avez une), puis à exécuter java et à interroger la base de données pour obtenir la réponse. Bien sûr, il faudrait que vous passiez à Java un moyen d'entrer les données pour insérer un enregistrement que vous pourriez identifier (une sorte de hachage), je n'ai jamais fait cela en Java, c'est juste une théorie sur la façon dont vous pouvez le faire. pourrait être en mesure de le faire .

Mise à jour

Vous pouvez essayer la sortie standard comme suggéré par darko petreski comme une autre option également.

0voto

Silvio Donnini Points 1526

Si le code PHP doit être exécuté dans un serveur (et non via la ligne de commande), l'utilisateur qui exécute l'exécutable java est www-data, pas vous. Dans ce cas, assurez-vous que www-data a les permissions de lire le fichier jar et d'exécuter l'exécutable java.

0voto

Buggabill Points 5272

La première chose que je vérifierais/changerais est la ligne de la fonction où vous construisez le fichier $jarPath variable à partir de cela :

$jarPath = $_SERVER['DOCUMENT_ROOT'] . "myFolder/tools_new/includes/Rank.jar";

à ça :

$jarPath = $_SERVER['DOCUMENT_ROOT'] . "/myFolder/tools_new/includes/Rank.jar";

La barre oblique de fin de ligne peut ne pas être présente dans le fichier $_SERVER['DOCUMENT_ROOT'] ce qui pourrait causer des problèmes.

Je suppose que lorsque vous dites qu'il fonctionne à partir de la console, vous exécutez la commande java comme suit :

$ java -jar /rest/of/path/myFolder/tools_new/includes/Rank.jar aspdotnet/microsoft.com

Je m'assurerais que vous incluez le chemin d'accès au binaire java dans le fichier $command variable comme ça...

$command = "/path/to/java -jar $jar aspdotnet/microsoft.com";

L'utilisateur qui possède le processus du serveur Web ne dispose peut-être pas d'une variable $PATH incluant le chemin d'accès au binaire Java.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X