IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Réutilisation des services entre les requêtes


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2
    Par défaut Réutilisation des services entre les requêtes
    Bonjour,

    Je souhaite réaliser un compilateur web dans l'esprit de cpp.sh ou replit (https://repl.it/languages/c). Mon interface web se connecte au serveur grâce à SSH (librairie libssh2 de php).
    Lorsque l'utilisateur appuie sur le bouton run, le code est envoyé au serveur sous forme de fichier, le serveur le compile et l'exécute, l'interface doit récupéré la sortie et l'afficher dans un div Console.
    Pour ce faire, l'interface lit la sortie tant que celle ci est non nulle.

    Mon problème est qu'à chaque nouvelle requête, Symfony réinstancie le service qui gère la connexion SSH. En effet, si le programme de l'utilisateur contient une fonction de lecture (scanf en C par exemple) alors cela devient très problématique de répondre au serveur pour qu'il puisse terminer l'exécution du programme.

    Je souhaiterais donc savoir s'il est possible de faire en sorte que Symfony garde le même objet Service durant toute l'exécution du programme de l'utilisateur ?

    Je met ici le code de la classe qui gère la connexion SSH:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     
    <?php
     
    namespace MainBundle\Services;
     
    class GestionSSH{
     
        private $m_host;
        private $m_login;
        private $m_mdp;
        private $m_connexion;
        private $m_stream;
     
     
        public function __construct($ssh_adr,$ssh_login,$ssh_password){
     
            $this->m_host=$ssh_adr;
            $this->m_login = $ssh_login;
            $this->m_mdp = $ssh_password;
     
            $this->m_connexion = ssh2_connect($this->m_host);
    	ssh2_auth_password($this->m_connexion,$this->m_login,$this->m_mdp);
     
            $this->setStream("./a.out"); //./a.out est un programme qui lit une chaine de caractère et l'affiche ensuite 
        }
     
        function setStream($cmd){
            $this->m_stream = ssh2_exec($this->m_connexion,$cmd);
            stream_set_blocking($this->m_stream, true);
        }
     
        function lire(){
     
            return fread($this->m_stream, 4096);
        }
     
        function ecrire($msg){
            flush();
            fwrite($this->m_stream,$msg.PHP_EOL);
     
        }
     
    };
    ?>
    Ainsi que ma classe Controller:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    <?php
     
    namespace MainBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpFoundation\Request;
     
     
    class MainController extends Controller{
     
        public function indexAction(){
     
            $content=$this->get('templating')->render('MainBundle:Console:console.html.twig',array(""));
     
            return new Response($content);
     
     
        }
     
    //Envoie les messages au serveur
            public function inputAction(Request $request){
                $logger = $this->get('logger');
     
                $ssh = $this->container->get('gestionssh');
     
     
                $msg = $request->request->get('msg');
     
                $ssh->ecrire($msg);
     
                return new Response();
     
    	}
     
    //Lit les messages du serveurs et les envoie à l'interface
            public function outputAction(Request $request){
                $logger = $this->get('logger');
                $ssh = $this->container->get('gestionssh');
     
                $output = $ssh->lire();
                $logger->info("Log output : ".$output);
                if($output){
                    $logger->info("Log output : ".$output);
                    return new Response($output);
                }
                else{
                    return new Response("END");
                }  
            }   
    }
     
    ?>
    Merci d'avance pour vos réponses.

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    Globalement Symfony ne peux pas dépasser les limites de PHP lui même. Pourquoi ne pas utiliser un outil comme REDIS pour garde le même objet Service durant toute l'exécution du programme de l'utilisateur , un stockage sur la ram puis à l'utilisateur de décider l'exécution

  3. #3
    Nouveau candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2
    Par défaut
    Je ne connais pas cet outil, je vais aller voir ce que c'est exactement ! En tout cas, c'est bien dommage qu'il n'y ait pas une façon simple de faire !

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/04/2011, 15h07
  2. le passage des données entre les onglets
    Par jack_1981 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 16/05/2007, 01h12
  3. Réponses: 2
    Dernier message: 28/02/2007, 13h13
  4. Réutilisation des résultats d'une requête en DISTINCT
    Par r@phy dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 04/09/2006, 17h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo