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

Langage PHP Discussion :

Redémarrer Apache avec une application Web [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 18
    Points
    18
    Par défaut Redémarrer Apache avec une application Web
    Bonjour à tous,

    voilà ça fait quelques jours que je planche sur un petit problème, je fais donc appel à vous .

    En fait j'ai pour objectif de réaliser une petite application Web qui donne la possibilité à l'utilisateur de redémarrer / arrêter le serveur Apache qui héberge cette appli.

    Pour arrêter apache il n'y a pas de souci, c'est en fait pour le redémarrer que ça pose problème.

    L'application Web fonctionnant sur le serveur Apache lui même mon problème vient du fait que quand je lance mon script PHP qui est censé redémarrer le serveur, celui ci s'arrête bien mais ne redémarre pas.. J'en ai conclut que le fait que le serveur soit arrêté, mon script et stoppé juste après l'arrêt du serveur et donc le redémarrage n'a pas lieu.

    J'utilise la fonction proc_open() pour exécuter mes commandes (j'ai aussi testé avec exec() mais sans résultat).
    Je me disais que peut être une option de la fonction proc_open() pourrait m'aider mais je n'ai pas trouvé. Idem pour les variables d'environnements je ne sais pas si elles pourraient jouer un rôle dans la résolution de mon problème.

    J'ai aussi pensé à une applet JAVA qui s'occuperait de lancer les commandes, mais je crains avoir le même souci du fait que l'applet serait géré par Apache (comme pour mon script PHP) et donc stoppé lorsque le serveur s'arrête.

    En fait ce que j'aimerais savoir, c'est s'il est possible d'exécuter une commande en tâche de fond, pour que la commande ne soit pas stoppée lors de l'extinction d'Apache. Peut être que ça se joue au niveau des variables d'environnements de proc_open, ou des options ?

    L'idée de développer un serveur Web pour mon application m'a traversé l'esprit mais j'ai vite abandonné l'idée ^^, j'ai suffisamment de travail sur mon application .

    Je vous poste le code qui s'occupe d'exécuter ma commande de redémarrage, s'il y a d'autres informations dont j'aurais oublié de préciser n'hésitez pas à me les demander .

    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
    public function run($command){
     
    		$descriptorspec = array(
    			0 => array("file", $logfile, "a"),  // stdin is the log file
    			1 => array("file", $logfile, "a"),  // stdout is the log file
    			2 => array("file", $errorfile, "a"), // stderr is the log file
    		);
     
    		$process = proc_open("sudo " . $command, $descriptorspec, $pipes, NULL, $_ENV);
     
    		if (is_resource($process)) {
        		fclose($pipes[0]);
     
        		while(!feof($pipes[1]))
            		echo fgets($pipes[1], 1024);
     
            	//Closing
            	fclose($pipes[1]);
        		$return_value = proc_close($process);
     
        		if($return_value == 0)
        			return true;
        		else
        			return false;
    		}
    	}
    Merci d'avance

    ++
    Sliim

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    bon j'ai fini par trouver . Je post la solution pour les intéressés.

    Le problème majeur qui se posait, c'était qu'en redémarrant apache via une commande exécutée avec exec(), proc_open() etc.. le script est stoppé lorsque le processus d'apache est tué. Donc une fois le serveur apache éteint celui ci ne redémarre pas car la commande de redémarrage est stoppée en même temps que le serveur apache. Bref, la commande lancée utilise le processus apache qui lui même est tué lorsqu'on veut le redémarrer ^^.

    Donc j'ai regardé si il y avait possibilité de lancer un script avec un process différent de celui d'apache, afin que le script puisse continuer même lorsque le process apache est tué. Voici les liens qui m'ont "sauvés" :

    http://www.lindev.fr/index.php?post/...-PHP-en-Daemon
    http://php.net/manual/fr/ref.pcntl.php

    Il s'agit de créer un démon PHP, indépendant du process apache afin d'exécuter la commande de redémarrage. En fait l'extension PCNTL permet de faire un fork sur le processus apache .

    Personnellement je pense qu'il y a assez d'infos sur ces deux liens pour comprendre le fonctionnement, je ne vais pas les répéter. Par contre voici mon code (un peu réduit pour ne pas encombrer la page) :

    Démon :
    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
    <?php
    $a = getopt("a::");
     $action = $a["a"];
     $pid = pcntl_fork();
     if ($pid == -1){
    	/* fork failed*/
    	echo "Échec du fork!\n";
    	exit();
     }
     elseif ($pid){
    	/* End of parent process  */
    	exit();
     }
     else{
    	/* Children process */
     
    	//Fact of the process running a leader of session
    	posix_setsid();
     
    	//Change current directory for script execution
    	chdir('/');
     
    	//Change PHP umask on 0777
    	umask(0);
     
    	//Reboot apache
    	if($action == "reboot")
    		$restart = exec('sudo /etc/init.d/apache2 restart');
     
    	//stop apache
    	else if($action == "stop")
    		$restart = exec('sudo /etc/init.d/apache2 stop');
     
    	//Kill the children process
    	exit();
     }
    Script php qui lance le démon :
    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
    <?php
    $deamon = "myDeamon.php";
    $action = $_GET["a"]; //--reboot || stop--\\
    $errorLog = dirname(dirname(__FILE__)) . "/logs/error.log";
    $descriptorspec = array(
       0 => array("pipe", "r"),  // stdin est un pipe où le processus va lire
       1 => array("pipe", "w"),  // stdout est un pipe où le processus va écrire
       2 => array("file", $errorLog, "a"), // stderr est un fichier où le processus va écrire
     );
     
    $process = proc_open("sudo php " . $deamon . " -a'$action'", $descriptorspec, $pipes);
    	 	if (is_resource($process)) {
    		    fclose($pipes[0]);
     
    		    while(!feof($pipes[1])) {
    		        echo fgets($pipes[1], 1024);
    		    }
    		    fclose($pipes[1]);
    		    $return_value = proc_close($process);
    		    if($return_value != 0)
    		    	echo "\n\nUne erreur est survenue, code de sortie du processus : $return_value\nVoir error.log pour plus de détails.";
    		}
    Le script php est lancé via ajax afin de ne pas recharger la page (ce qui génèrerait une erreur de connexion au serveur si celui ci est en train de redémarrer). Ce script php lance ensuite mon démon php en cli qui s'occupe de créer un processus fils, tuer le père et utiliser le processus fils pour lancer la commande d'arrêt ou de redémarrage.

    Voilà, bon cette méthode me sert pour me dépanner, pour mon projet il va falloir que je prévois un serveur Web dédié à mon application Web. Si vous avez des conseils dans ce domaine je suis preneur .

    S'il y a des points où je n'est pas été clair n'hésitez pas à me demander .

    Ah oui encore autre chose, dans le fichier de log des erreurs j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    No entry for terminal type "unknown";
    using dumb terminal settings.
    Et cela à chaque fois que j'utilise ma fonction proc_open() dans mon script PHP. Savez vous comment corriger cette erreur ? Apparemment il s'agirait de la configuration du terminal utilisé par proc_open() ?

    ++
    Sliim

  3. #3
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 305
    Points : 15 633
    Points
    15 633
    Par défaut
    Citation Envoyé par Sliim Voir le message
    Voilà, bon cette méthode me sert pour me dépanner, pour mon projet il va falloir que je prévois un serveur Web dédié à mon application Web. Si vous avez des conseils dans ce domaine je suis preneur .
    déjà explique nous pourquoi tu as besoin de redémarrer Apache aussi souvent ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Bonjour mathieu,

    en fait mon application sera une application Web qui permettra de configurer un serveur Web sous LAMP. De ce fait à chaque modification de la configuration d'apache, l'utilisateur aura besoin de redémarrer apache pour prendre en compte la nouvelle configuration d'où la nécessité de le redémarrer simplement via l'application (si c'est pour ouvrir une connexion ssh pour redémarrer le serveur merci la galère ).

    Bon après j'ai "mal" étudié mon projet, en effet, si l'utilisateur se trompe dans la configuration, le redémarrage du serveur apache sera un échec et donc l'application sera indisponible pour modifier la configuration.

    Il me faudra donc passer l'application comme serveur Web elle même (dans le même genre que vmware, webmin et autres..) afin qu'elle puisse être disponible même si apache est down. C'est pour cela que je commence à y songer. Après je ne sais pas si je devrais développer mon propre serveur web ou alors en récupérer un libre. Dans tout les cas, le serveur web que j'utiliserais devra supporter l'url rewriting (utilisation de ZF).

    Voilà voilà

    Je précise que mon projet sera libre sous licence GPL.

    ++
    Sliim

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Upload avec une application web
    Par beps03 dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 11/03/2011, 12h14
  2. Samba sous Ubuntu avec une application web en PHP
    Par Cristabelle dans le forum Ubuntu
    Réponses: 0
    Dernier message: 21/05/2010, 13h36
  3. Coupler Exchange avec une application Web
    Par ylabarre dans le forum Exchange Server
    Réponses: 2
    Dernier message: 10/08/2007, 09h22
  4. Comment utiliser une webcam avec une application web
    Par /*Mr.D*/ dans le forum Services Web
    Réponses: 3
    Dernier message: 24/01/2007, 07h59
  5. Interrogation bdd oracle avec une application web
    Par Lemuel dans le forum Oracle
    Réponses: 2
    Dernier message: 09/12/2006, 14h09

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