Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/08/2014, à 11:17

tanebisse

[Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

Bonjour,
J'ai un serveur Ubuntu 14.04 avec PHP/Apache/Postgresql. J'ai une application Web PHP qui tourne dessus et je voudrais pouvoir lancer l'exécution d'un JAR autonome depuis cette application comment faire ? Dois-je installer TomCat ?
Puis-je utiliser une commande du genre 

system('java -jar monProgramme.jar', $data);

Dernière modification par tanebisse (Le 25/02/2015, à 18:06)

Hors ligne

#2 Le 28/08/2014, à 11:34

claudius01

Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

Bonjour,

Je ne pense pas car TomCat est avant tout un serveur de Servlets et JSP.
Dans ton cas, tu fais appel au système pour lancer ledit .jar dans la JVM.


Cordialement, A+
--
Claudius

Hors ligne

#3 Le 28/08/2014, à 12:20

tanebisse

Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

Peux tu me donner un exemple ou des liens pour faire ça ?
J'ai un serveur Ubuntu basique que dois-je installer pour que ça fonctionne ?
As-tu des préconisations, conseils ou astuces ?

Hors ligne

#4 Le 28/08/2014, à 13:23

claudius01

Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

Run Java class file from PHP script on a website
Executer un programme java depuis php
execute java application from php

trouvés avec ce cher Google: php java execution

Bonnes lectures...


Edit: Attention aux aspects sécurité si ce serveur a un accès public (cf. php exec security problems ?) avec notamment

1) exec ('ping google.com') ;
2) exec ('ping' $ _GET ['domaine']);. .
3) exec ('ping' escapeshellarg ($ _GET ['domaine']));

Exemple 1 est sûr, parce que vous ne pouvez pas "injecter" quoi que ce soit en elle; c'est une chaîne codée en dur.
Exemple 2 est très dangereux, parce que vous pouvez facilement injecter quelque chose dans la valeur de $ _GET ['domaine'].
Exemple 3 est très sûr, parce que la fonction escapeshellarg() empêche les gens d'ajouter des trucs supplémentaires comme "rm-f /" ou autre ..

Les Pro de PHP que je ne suis pas me corrigeront si grosses bétises ;-)


Cordialement, A+
--
Claudius

Dernière modification par claudius01 (Le 29/08/2014, à 15:40)

Hors ligne

#5 Le 26/09/2014, à 11:14

tanebisse

Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

J'arrive à exécuter le code en ligne de commande mais pas depuis ma page web via un script PHP qui s'exécute sur le serveur. N'y a-t-il pas un truc à configurer sur Apache ou autres pour autoriser l'exécution de code java ?

Hors ligne

#6 Le 26/09/2014, à 11:25

claudius01

Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

Je ne pense pas, cela serait plutôt des droits définis dans le php.ini (que Apache peut modifier/compléter)
cf. exec — Exécute un programme externe

Hors ligne

#7 Le 26/09/2014, à 11:46

tanebisse

Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

Merci pour tes liens mais si je pose des questions ici c'est que j'a déjà lu la doc et que je n'y ai pas trouvé la solution.

Hors ligne

#8 Le 26/09/2014, à 11:59

jplemoine

Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

tanebisse a écrit :

Merci pour tes liens mais si je pose des questions ici c'est que j'a déjà lu la doc et que je n'y ai pas trouvé la solution.

Toi, sûrement (puisque tu le dis) mais 90% des gens ne font pas cet effort....
Vu le nombre de discussions (avec la même réponse) sur le /boot plein (entre autres), je peux l'affirmer.. smile

La question est que l'utilisateur www-data peut-il démarrer la JVM ?
Quand tu dis que ça fonctionne en ligne de commande, c'est avec quel utilisateur ?


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#9 Le 26/09/2014, à 13:57

claudius01

Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

tanebisse a écrit :

J'arrive à exécuter le code [java] en ligne de commande mais pas depuis ma page web via un script PHP qui s'exécute sur le serveur.

As-tu testé via la page Web un autre bout de code que java en guise de lever de doute (droits d’exécution / java / etc.) avec par exemple:

<?php
...
$command = 'ls -l';
exec($command, $result, $return);

if ($return == 0) {
   echo '=> [' . $result[0] . ']'; echo '<br />';
}
...
?>

Hors ligne

#10 Le 01/10/2014, à 09:14

tanebisse

Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

J'ai réussi à le faire fonctionner en test sur Wapp (Windows Apache Postgresql). Je vais ensuite passer à Lapp (Windows Apache Postgresql).
Lors de l'exécution de la commande

 exec('java -jar monProgramme.jar', $data);

L'application utilise Java 7 hors j'ai java 8 d'installé et quand je passe par l'invite de commande en faisant java -version c'est bien java 8 qui ressort.
Sans être obligé d'indiquer le lien en dur dans ma commande

exec('C:\java_test\jdk1.8.0_20\bin\java.exe -jar', $data);

Où puis-je spécifier le chemin vers Java pour l'exécution du programme ? N'y a-t-il pas un fichier de config quelque part ? Dans Apache peut-être ?

Hors ligne

#11 Le 01/10/2014, à 14:20

claudius01

Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

tanebisse a écrit :

L'application utilise Java 7 hors j'ai java 8 d'installé et quand je passe par l'invite de commande en faisant java -version c'est bien java 8 qui ressort.
Sans être obligé d'indiquer le lien en dur dans ma commande

Où puis-je spécifier le chemin vers Java pour l'exécution du programme ? N'y a-t-il pas un fichier de config quelque part ? Dans Apache peut-être ?

- Sauf erreur de ma part, "Dans Apache peut-être ?", je ne pense pas...
- Maintenant, il est fort probable qu'une exécution depuis la ligne de commande est faite au travers de bash qui a un .profile avec le bon PATH alors que depuis le exec de PHP, celle-ci se fasse au travers de sh dont le PATH est très limité

En effet, j'ai fais un test qui montrerais cela:

$ ps
  PID TTY          TIME CMD
 2288 pts/0    00:00:00 bash
 4445 pts/0    00:00:00 ps

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:...

Alors que depuis PHP par la méthode: getenv("PATH")

<?php
   ...
   print 'PATH [' . getenv("PATH") . ']';
   ...
?>

PATH [/usr/local/bin:/usr/bin:/bin] 

A confirmer/infirmer sur ton système avec le même type de test et si oui, mettre à jour la variable PATH comme indiqué dans le fil de discussion PHP exec $PATH variable missing elements

NB: J'ai eu le même souci avec la variable LD_LIBRARY_PATH que j'ai dû valoriser dans un exec depuis PHP pour l'appel d'un programme écrit en langage RUST ;-)

Hors ligne

#12 Le 05/10/2014, à 15:55

ghison31

Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

@tanebisse

Bonjour, c'est plus lourd à mettre en oeuvre mais tu peux lancer un "PHP/Java Bridge" (http://php-java-bridge.sourceforge.net/pjb/). J'ai eu l'occasion de l'utiliser et je peux t'assurer que cela fonctionne très bien.

Cordialement,

Ghison.

Hors ligne

#13 Le 08/01/2015, à 12:33

tanebisse

Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

Bonjour j'ai avancé sur mon problème j'arrive à exécuter mon programme sur WAPP mais pas sur LAPP.
Pour info j'ai vérifié et c'est l'utilisateur www-data qui est utilisé par PHP pour lancer la commande "java" via "exec".
J'ai ajouté à cet utilisateur le groupe "toto" et j'ai ajouté les droits rwx à ce groupe pour tout le répertoire et les sous-fichiers contenu (donc tous mes jars).
principal est le package Java dans lequel est contenu la classe Principale.
Je lance aussi un autre jar avant qui se nomme HelloWorld.jar pour lequel il n'y a pas de soucis.
Voici le message d'erreur que j'obtiens :

Usage: java [-options] class [args...]
           (to execute a class)
   or  java [-options] -jar jarfile [args...]
           (to execute a jar file)

where options include:
    -d32          use a 32-bit data model if available
    -d64          use a 64-bit data model if available
    -server       to select the "server" VM
                  The default VM is server,
                  because you are running on a server-class machine.


    -cp <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
                  A : separated list of directories, JAR archives,
                  and ZIP archives to search for class files.
    -D<name>=<value>
                  set a system property
    -verbose:[class|gc|jni]
                  enable verbose output
    -version      print product version and exit
    -version:<value>
                  require the specified version to run
    -showversion  print product version and continue
    -jre-restrict-search | -no-jre-restrict-search
                  include/exclude user private JREs in the version search
    -? -help      print this help message
    -X            print help on non-standard options
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions with specified granularity
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  disable assertions with specified granularity
    -esa | -enablesystemassertions
                  enable system assertions
    -dsa | -disablesystemassertions
                  disable system assertions
    -agentlib:<libname>[=<options>]
                  load native agent library <libname>, e.g. -agentlib:hprof
                  see also, -agentlib:jdwp=help and -agentlib:hprof=help
    -agentpath:<pathname>[=<options>]
                  load native agent library by full pathname
    -javaagent:<jarpath>[=<options>]
                  load Java programming language agent, see java.lang.instrument
    -splash:<imagepath>
                  show splash screen with specified image
See http://www.oracle.com/technetwork/java/javase/documentation/index.html for more details.
sh: 1: /var/www/xxxxxxxx/protected/tmp_csv/xxxxxxxx_lib/args4j-2.0.21.jar: Permission denied
sh: 1: /var/www/xxxxxxxx/protected/tmp_csv/xxxxxxxx_lib/postgresql-9.3-1100.jdbc4.jar: Permission denied
sh: 1: /var/www/xxxxxxxx/protected/tmp_csv/xxxxxxxx_lib/com.google.ortools.jar: Permission denied
sh: 1: principal.Principale: not found

Dernière modification par tanebisse (Le 25/02/2015, à 17:56)

Hors ligne

#14 Le 25/02/2015, à 18:05

tanebisse

Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache

En fait j'avais des problèmes de library path et de nommage de chemin qui sont différents entre un serveur windows et Linux.
Je fais un test en PHP grâce à la variable PHP_OS afin de connaître l'environnement et j'adapte ma commande en fonction. J'utilise aussi DIRECTORY_SEPARATOR et PATH_SEPARATOR pour simplifier l'écriture des chemins.
Et comme j'avais aussi des .dll ou des .so je redirige dans le bon repertoire en fonction de l'OS.

Hors ligne