Lancement du programme Scilab via PHP

Bonjour,

j'essaie de créer une interface web pour Scilab (logiciel de calcul opensource).

J'ai commencé à coder sous XP (à la demande de mes clients), qui m'ont demandé de passer sous Linux peu de temps après. Du coup j'ai installé Scilab sous Linux, et Xampp.

Dans mon code, j'exécutais un script Scilab grâce à la fonction PHP "exec", suivi d'une ligne qui lançait Scilab avec en argument le script à exécuter.

Sauf que, passé sous Linux, il ne veut plus rien entendre ^^"
J'ai essayé les commandes de base, du style ls ou pwd ça marche nickel, mais après pour celle qui m'intéresse rien ne va plus. Mon code de lancement :

exec ('/root/scilab-5.2.2/bin/scilab -f ./scripts/script'.$id.'/'.$this->scripts[$id]->getName().'.sci') ;

Scilab est bien installé dans root, mon script PHP qui appelle le programme est dans un dossier "poject" contenant "scripts" contenant lui même tous mes scripts (dans des dossiers script concaténés avec leur identifiants), et le script en lui-même est dans ce dossier.

J'ai bien sûr vérifié les droits d'accès à tous les fichiers.

Si quelqu'un a ne serait-ce qu'un semblant d'aide à me donner, je suis preneur ;)

23 réponses

Résumé de la discussion

Problème rencontré lors du déploiement d'une interface web pour Scilab sous Linux via PHP, après migration depuis Windows, consiste à lancer Scilab avec un script Sci via exec et à obtenir une non-réponse graphique. Les messages d’erreur évoquent des soucis graphiques et d’environnement X11, notamment Could not initialize graphics, Could not initialize class sun.awt.X11GraphicsEnvironment et l’absence d’affichage DISPLAY dans le contexte serveur. Les échanges suggèrent d’essayer shell_exec, de vérifier l’accès et le contexte d’exécution du serveur web, puis d’examiner l’environnement DISPLAY ou l’installation Java/GUI de Scilab pour résoudre le problème. Finalement, plusieurs intervenants constatent des erreurs Java/TK et l’impossibilité de créer une fenêtre Scilab dans un serveur sans affichage, sans aboutir à une solution commune à ce stade.

Bobot (l’IA à votre service)
  1. Quand tu lances scilab en ligne de commande depuis un terminal, ca marche bien ?
    1. oui ça marche bien, il me génère mes fichiers de sortie et tout se passe bien

      pendant que ça tourne, j'ai fait un petit "ps" pour savoir si Scilab se lance, et il ne se lance pas
      j'ai aussi essayé en mettant le chemin vers mon script en dur, aucun effet
      1. Je n'en suis pas sûr, c'est juste une idée :
        Quand tu fais /root/scilab-5.2.2/bin/scilab, sous linux ok, ca lance le programme depuis la racine du pc

        Mais quand tu veux le lancer depuis php, le / correspond à la racine du serveur php, pas à celle du pc ...
        1. dommage j'aurai bien aimé que soit ça ^^
          j'ai supposé que c'était ça, alors j'ai balancé le chemin en "absolu" depuis la racine serveur, ou en relatif par rapport à mon script et ça ne marche toujours pas :(
          1. En allant voir dans le man d'exec, je suis tombé sur ca :

            Lorsque le safe mode est activé, vous pouvez uniquement exécuter des programmes qui se situent dans le dossier défini par safe_mode_exec_dir. Pour des raisons pratiques, il n'est actuellement pas permis d''avoir le composant .. dans le chemin de l'exécutable. 


            Faut peut être aller désactiver le safe mode dans le php.ini ou déplacer le bin de scilab
            1. le safe mode est désactivé, j'avais vérifié
              mais j'ai trouvé d'autres modes

              safe_mode Off Off
              safe_mode_exec_dir no value no value
              safe_mode_gid On On
              safe_mode_include_dir no value no value

              y'a peut etre quelque chose que j'ai pas spécifié, mon Linux est sur une machine virtuelle à l'intérieur de mon XP, mais normalement ça pose pas de problème...
              1. Ben je vois pas là :O

                Je sais pas si ca change grand chose, mais y'a aussi la fonction php shell_exec()

                il doit bien ya voir une différence entre shell_exec et exec, même si je ne la connais pas ^^
                1. la différence c'est que shell_exec retourne le résultat de la commande sous forme de chaine, exec ne retourne rien sauf qi on met un argument (genre $out) après la commande, et retourne ça sous forme de tableau.

                  j'avoue que je commence un peu à péter un cable XD
                  1. le problème c'est que mon php attend la terminaison du programme pour récupérer les graphiques de retour, et du coup, ma page attend la fin sans fin (^^)

                    je teste en trafiquant et en générant avant les graphiques de retour et ça me donne quelque chose de pire ^^" :

                    !--error 999
                    Erreur Tcl: Erreur pendant l'initialisation de TK (Tk_Init): couldn't connect to display ":0.0"
                    1. et du coup, ma page attend la fin sans fin 


                      Ouais mais, si tu fais le echo avant, ca sera quand même affiché non ?
                      Ca fait longtps que j'ai plus fait de php, mais c'est ce qu'il me semble ^^
                      Sinon, tu prux écrire dans une sorte de fichier de log ... ^^
                      1. dans mon error.log j'ai ça :

                        No protocol specified
                        Could not initialize graphics Environment
                        Scilab Graphical option may not be working correctly.
                        An error occurred: Could not initialize class sun.awt.X11GraphicsEnvironment
                        Cannot create Scilab Window.
                        Check if the thirdparties are available (Flexdock, JOGL...).
                        See SCI/etc/classpath.xml for default paths.
                        Could not find class: Could not initialize class sun.awt.X11GraphicsEnvironment
                        1. Je vois ^^
                          Essayes en ajoutant les paramètres -nwni et -nb à l'appel de scilab :
                          exec ('/root/scilab-5.2.2/bin/scilab -nwni -nb -f ./scripts/script'.$id.'/'.$this->scripts[$id]->getName().'.sci') ;
                          1. ça a l'air de marcher car le processus scilab est maintenant visible avec "ps". Par contre, il me met une erreur :

                            usecanvas(%F) ;
                            !--error 999
                            Le module 'GUI' de Scilab n'est pas installé.
                            at line 178 of exec file called by :
                            exec('SCI/etc/scilab.start',-1);;exec('./scripts/script0/script0.sci',-1.awt.9

                            mais apparamment c'est dû à l'installation de scilab... je vais regarder à quoi ça correspond
                            1. toujours le même problème, j'ai essayé avec toutes les options de lancement, sans ça marche pas :'(

                              on dirait qu'il me manque un module de scilab pour afficher les graphiques ... quelqu'un a une idée ?
                              1. Initialisation :
                                Chargement de l'environnement de travail
                                !--error 999
                                Le module Scilab Graphics n'est pas installé.
                                at line 9 of function createOrSetFigure called by :
                                at line 14 of function figure called by :
                                figure(1);
                                at line 179 of exec file called by :
                                exec('SCI/etc/scilab.start',-1);;exec('./scripts/script0/script0.sci',-1)

                                mon module "graphics" est bien installé, j'ai meme réinstallé scilab-5.2.2 et je trouve pas comment résoudre ça :/

                                besoin d'aide
                                1. help plz
                                  1. je fais la même chose ke toi, et j'ai pas réussi à trouver une solution. j'ai essayé sur plusieurs Forum mais tjs pas de solution :S
                                    en fait moi aussi je développe une interface via php et je veut lancer scilab via php

                                    kan je fais ça :
                                    system('/home/tout/Téléchargements/scilab-5.1.1/bin/scilab -f ./simulation/simulation_morphologique/test.sce') ;

                                    il m'affiche l'erreur suivant :
                                    Error occurred during initialization of VM java.lang.UnsatisfiedLinkError: no zip in java.library.path at java.lang.ClassLoader.loadLibrary(Unknown Source) at java.lang.Runtime.loadLibrary0(Unknown Source) at java.lang.System.loadLibrary(Unknown Source) at java.lang.System.initializeSystemClass(Unknown Source) !--error 999 Tcl Error: Error during the TK initialization (Tk_Init): no display name and no $DISPLAY environment variable

                                    si tu trouve klk chose merci de le mettre ici et moi pareil

                                    bonne chance
                                    A+
                                  2. moi ça a pas résolu mon problème, mais essaies :

                                    $set_display = "set env DISPLAY=:0.0 && X : 0.0" ;
                                    exec ($set_display) ;
                                    system('DISPLAY=:0.0 /home/tout/Téléchargements/scilab-5.1.1/bin/scilab -f ./simulation/simulation_morphologique/test.sce') ;

                                    redis moi le résultat
                                  3. voilà le résultat :
                                    Error occurred during initialization of VM java.lang.UnsatisfiedLinkError: no zip in java.library.path at java.lang.ClassLoader.loadLibrary(Unknown Source) at java.lang.Runtime.loadLibrary0(Unknown Source) at java.lang.System.loadLibrary(Unknown Source) at java.lang.System.initializeSystemClass(Unknown Source) !--error 999 Tcl Error: Error during the TK initialization (Tk_Init): couldn't connect to display ":0.0"

                                    tu peux me dire tu veux faire koi ?? et cé koi set env DISPLAY=:0.0 && X : 0.0 ??
                                    Merci
                                  4. ben t'es sous linux ?
                                    parce que moi mon interface marchait nickel sur windows, mais pour des raisons techniques j'ai dû passer sous linux (enfin machine virtuelle OpenSUSE)

                                    j'ai entendu dire qu'Apache n'avait pas les droits nécessaires pour accéder au display (affichage graphique) de l'utilisateur courant, et il semblerait que scilab en ait besoin même si on veut lancer un script scilab en mode batch.

                                    du coup dans la console il faut taper xhost +local:apache@

                                    et dans le script php il faut rajouter ces lignes avant d'exécuter le script scilab pour pouvoir accéder au display :

                                    $set_display = "set env DISPLAY=:0.0 && X : 0.0" ;
                                    exec ($set_display) ;
                                  5. et tu exécute de cette manière :

                                    system('DISPLAY=:0.0 /home/tout/Téléchargements/scilab-5.1.1/bin/scilab -f ./simulation/simulation_morphologique/test.sce') ;
                                2. je peux pas t'aider j'en suis là moi aussi ça résoud pas mes problèmes :/

                                  je t'envoie mes sources, cherche de ton coté ;)

                                  http://bugzilla.scilab.org/show_bug.cgi?id=7145
                                  http://forum.ubuntu-fr.org/viewtopic.php?id=174370 (à lire jusqu'au bout)
                                  |I am posting this as I see quite a few people looking to create a web
                                  based interface to their MP3 player (XMMS or really what ever you want
                                  to call from the command line) on Linux. Alas, I am not the only one,
                                  and I did not think of it first ( suppose I have to result to other get
                                  rich quick schemes). And even if there were a direct downloadable
                                  utility (as there is XMMS-Control) you, like me, probably want the bowl
                                  of porage that is just right. Which means you want to make your own
                                  because current versions of X, Y, or Z just don't do what you want.

                                  Most of the hard work is at the linux command shell (ugh! - I heard
                                  that! Drop and give me 20 command line scripts!)

                                  login as root

                                  ensure /dev/dsp has the proper access privileges
                                  chmod a+rw /dev/dsp

                                  add apache to the local list of users for the xserver.
                                  xhost +local:apache@

                                  You should see the following if apache is not added to the xserver.

                                  Xlib: connection to ":0.0" refused by server
                                  Xlib: No protocol specified

                                  ** CRITICAL **: Unable to open display

                                  And I am sure that error is as clear to you as it was to me!

                                  NOTE !!! only change the following for testing purposes so that you can
                                  su to apache from root and test xmms !!!!

                                  Temporarily change the line

                                  apache:x:48:48:Apache:/var/www:/sbin/nologin

                                  To
                                  apache:x:48:48:Apache:/var/www:/bin/bash

                                  so that you can test out apache access to the Xserver and XMMS.

                                  su apache
                                  xmms
                                  !!! Play a file - Don't just read this actually play a file!!! The
                                  reason is that if it fails xmms will likely give an error you can track
                                  down like a greyhound chases that little bunny at the dog track!
                                  (speaking of get rich quick schemes)

                                  And for the grand finale!

                                  If you can call xmms from the command line you can likely do the
                                  following (unless you are running php in safe mode). Ensure that the
                                  wav, mp3, or whatever you decide to test it with is accessible to
                                  apache. I put the file into /var/www/html/icould.wav and chmod a+rw
                                  icould.wav

                                  <?php
                                  echo ' Executing XMMS ';
                                  // note you could use system too!
                                  //echo system( '/usr/bin/xmms --play icould.wav', $retval );
                                  exec ('/usr/bin/xmms --play icould.wav');
                                  ?>

                                  At your browser ensure you hit shift+refresh(button) so your browser
                                  doesn't give you a cahed the web page.

                                  Brian J. Davis|
                                  1. ok merci à toi,
                                    je te tiens au courant si je trouve la solution

                                    bonne chance à nous :)
                                    A+
                                3. essaye ce code :

                                  system('HOME=/data/www/grainVirtuel /usr/bin/scilab -nwni -nouserstartup -f /data/www/grainVirtuel/simulation/simulation_morphologique/M.sce') ;

                                  HOME=/data/www/grainVirtuel : l'endroit où apache a le droit d'écriture

                                  chez moi ça marche et il gère les fichier des sorties.

                                  dis moi si ça marche ou pas

                                  A+
                                  • 1
                                  • 2