#1 Le 28/08/2014, à 10: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, à 17:06)
Hors ligne
#2 Le 28/08/2014, à 10: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, à 11: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, à 12: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, à 14:40)
Hors ligne
#5 Le 26/09/2014, à 10: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, à 10: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, à 10: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, à 10:59
- jplemoine
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.
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..
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 ?
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
#9 Le 26/09/2014, à 12:57
- claudius01
Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache
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, à 08: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, à 13:20
- claudius01
Re : [Résolu]Exécuter un jar via PHP sur serveur Ubuntu Apache
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 commandeOù 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, à 14: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, à 11: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, à 16:56)
Hors ligne
#14 Le 25/02/2015, à 17: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