Partage
  • Partager sur Facebook
  • Partager sur Twitter

comment lancer un fichier PHP depuis PHP?

Peut-on lancer via du code PHP un autre fichier PHP?

Sujet résolu
    23 mai 2022 à 9:42:06

    Bonjour, (question de débutant) j'ai un fichier PHP sur Raspberry que je peux lancer via un script :

    #!/bin/bash
    
    # script de lancement du code php
    
    echo "Execution de surveillance_donnees.php"
    
    php -f surveillance_donnees.php
    
    echo "c'est fait!"
    
    

    ce fichier contient ceci :

    <?php
    
    $file = fopen("/home/pi/script/contenu_mail.ini", "a");
    fwrite($file,"DEST=adresse mail du destinataire
    SUBJECT=Alerte
    TITLE=Alerte problème réception données ruche
    TEXT=Salut,<br>Ici le raspberry. C'est la ruche n° donnees['id_ruche'] Il y a un problème de réception de données!
    FILELIST=");
    
    fclose($file); ?>



    A la fin du fichier surveillance_donnees.php je souhaiterais (si c'est possible) exécuter un autre fichier PHP (nommé sendmail_simple.php)

    j'ai réussi depuis le script en rajoutant la ligne suivante :

    echo"on envoie le mail"
    php -f /home/pi/script/sendmail_simple.php /home/pi/script/contenu_mail.ini

    Mais j'aurais voulu savoir si et comment on pouvait directement dans surveillance_donnees.php lancer à la suite l'exécution du fichier sendmail_simple.php avec comme paramètre le fichier contenu_mail.ini (qui a été généré par surveillance_donnees.php)

    Merci



    -
    Edité par GillesMangin-Voirin 23 mai 2022 à 13:54:04

    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2022 à 10:43:57

      Bonjour,

      Et si tu mets directement le code php de ton second script à la fin du premier ?

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        23 mai 2022 à 11:00:13

        Ben sur celui -là je ne veux pas trop le faire le second code php (sendmail_simple.php) n'est pas de moi et est assez complexe, il gère l'envoi d'email avec phpmailer...

        De plus j'ai essayé sans succès pour le moment de rajouter du code PHP a mon premier et cela ne tourne plus du tout (encore une fois je ne sais pas trop ou je merdois...). Rajout de code d'une requête pour déclencher l'envoie de l'email!

        le code complet qui ne fonctionne pas est :

        <?php
        
        // ouverture base de données ruches
        
        error_reporting(E_ALL);
        ini_set('display_errors', TRUE);
        ini_set('display_startup_errors', TRUE);
        
        /* Connexion à une base MySQL avec l'invocation de pilote */
        
        $dsn = 'mysql:dbname=ruches;host=127.0.0.1';
        $user = 'abeille';
        $password = 'password';
        
        
        try {
            $bdd = new PDO($dsn, $user, $password);
        // Activation des erreurs PDO
         $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
        // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
        
         $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        	} catch (PDOException $e) {
            echo 'Connexion échouée : ' . $e->getMessage();
        							 }
        
        // requête de surveillance
        
        $reponse = $bdd->query("SELECT M1.id_ruche, MAX( M1.horodatage ) AS derniere_mesure FROM Telemesures_ruches M1 GROUP BY M1.id_ruche HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE ORDER BY M1.id_ruche");
        
        $donnees = $reponse->fetch();
        
        
        
        
        // création du fichier d'envoie d'email
        
        $file = fopen("/home/pi/script/contenu_mail.ini", "a");
        fwrite($file,"DEST=adresse mail du destinataire
        SUBJECT=Alerte
        TITLE=Alerte problème réception données ruche
        TEXT=Salut,<br>Ici le raspberry. C'est la ruche n° $donnees['id_ruche'] Il y a un problème de réception de données!
        FILELIST=");
        
        fclose($file);
        
         
        ?>


        Je ne sais même pas comment suivre le déroulement du code, puisque je le lance directement sur le Raspberry...

        Merci

        • Partager sur Facebook
        • Partager sur Twitter
          23 mai 2022 à 11:50:14

          Tu peux faire de ton fichier sendmail.php une fonction puis appeler la fonction dans ton script avec les parametres correspondants ?
          • Partager sur Facebook
          • Partager sur Twitter
            23 mai 2022 à 13:03:39

            +1 pour la réponse d'Asmitta.

            On peut supposer que pour lancer le programme sur le PI tu es connecté d'une manière ou d'une autre : console, ssh, cockpit, etc

            Donc pour suivre le déroulement du programme, il te suffit de faire des instructions echo dans ton programme.

            Tu peux aussi écrire dans un fichier de log soit en redirigeant la sortie standard soit écrire dans un fichier soit utiliser une bibliothèque de log comme monolog.

            A+

            • Partager sur Facebook
            • Partager sur Twitter
              23 mai 2022 à 13:39:20 - Message modéré pour le motif suivant : La demande de l'équipe de modération a été honorée


              Pas d'aide concernant le code par MP, le forum est là pour ça :)

                23 mai 2022 à 13:57:21

                Bonjour, actuellement je lance "manuellement" le script qui lance PHP (via une demande d'exécution du script depuis le Raspberry) dans le futur une fois tout opérationnel c'est la crontab qui lancera la tache!

                Pour ce qui est de faire de mon fichier sendmail_simple une fonction j'avoue ne  pas du tout connaitre...

                Comment doit-on procéder?

                Merci

                PS: j'ai modifié le titre qui du coup est un peu redondant avec le sous-titre...

                • Partager sur Facebook
                • Partager sur Twitter
                  23 mai 2022 à 14:18:30

                  GillesMangin-Voirin a écrit:

                  Ben sur celui -là je ne veux pas trop le faire le second code php (sendmail_simple.php) n'est pas de moi et est assez complexe, il gère l'envoi d'email avec phpmailer...


                  Ton fichier sendmail recoit les donnees a envoyer par post/get ? 

                  Sinon, si il faut inclure le code de sendmail comme l'a dit @monkey3d dans ton surveillance on pourrait avoir: 

                  <?php
                  	use PHPMailer\PHPMailer\PHPMailer;
                  	use PHPMailer\PHPMailer\SMTP;
                  	use PHPMailer\PHPMailer\OAuth;
                  	use PHPMailer\PHPMailer\Exception;
                  
                          /////
                          /////
                       
                          $mail->isHTML(true);
                  	$mail->setFrom($sender, $name);
                  	$mail->addReplyTo($sender);
                  	$mail->addAddress($receiver);
                  	$mail->Subject = $subject;
                  	$mail->Body = $msg;
                  	//$mail->AltBody = $msg;
                  
                  	if (!$mail->send()) {
                  		//echo 'Mailer Error: '.$mail->ErrorInfo;
                  	}
                   
                          // Puis ton code initial
                          $file = fopen("/home/pi/script/contenu_mail.ini", "a");
                          fwrite($file,"DEST=adresse mail du destinataire
                              SUBJECT=Alerte
                              TITLE=Alerte problème réception données ruche
                              TEXT=Salut,
                  Ici le raspberry. C'est la ruche n° $donnees['id_ruche'] Il y a un problème de réception de données! FILELIST="); fclose($file);

                  GillesMangin-Voirin a écrit:

                  De plus j'ai essayé sans succès pour le moment de rajouter du code PHP a mon premier et cela ne tourne plus du tout (encore une fois je ne sais pas trop ou je merdois...). Rajout de code d'une requête pour déclencher l'envoie de l'email!


                  Je ne sais même pas comment suivre le déroulement du code, puisque je le lance directement sur le Raspberry...

                  Merci


                  A quel niveau as tu des erreurs ? Et pour suivre le deroulement, si echo affiche du texte quelque part, fais des die() un peu partout progressivement  dans ton code pour voir ces messages.

                  GillesMangin-Voirin a écrit:

                  Pour ce qui est de faire de mon fichier sendmail_simple une fonction j'avoue ne  pas du tout connaitre...

                  Comment doit-on procéder?

                  Merci

                  PS: j'ai modifié le titre qui du coup est un peu redondant avec le sous-titre...

                  Montre nous le code, une version simplifiee.

                  Tu peux aussi faire un include ""...

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 mai 2022 à 15:56:09

                    Si ultérieurement ton script sera lancé par un crontab alors à mon sens le mieux est de créer un fichier et de mettre les traces dedans.

                    Le plus simple tu rediriges l'entrée standard et l'erreur dans le fichier dans ta commande de crontab ... ce qui nécessite quand même de mettre des traces dans tes fichiers actuels.

                    commande > fichier_log 2>&1

                    Pour explication plus complète : https://www.tuteurs.ens.fr/unix/shell/entreesortie.html

                    Un peu moins simple tu ouvres un fichier avec les instructions php ad hoc et tu logues les traces dedans.

                    Un peu plus complexe, tu utilises une librairie de log : je pense que c'est un peu surdimensionné pour ton besoin actuel.

                    A+

                    -
                    Edité par monkey3d 23 mai 2022 à 16:23:41

                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 mai 2022 à 16:06:41

                      php -f surveillance_donnees.php 2> logs.txt

                      Ceci affiche les erreurs dans logs.txt
                       

                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 mai 2022 à 16:20:27

                        Non le fichier sendmail_simple.php reçoit les informations via le fichier contenu_mail.ini dont on lui indique le chemin en paramètres du genre :

                        php -f /home/pi/script/sendmail_simple.php /home/pi/script/contenu_mail.ini

                        il lit le contenu du fichier ;

                        DEST=adresses mail des destinataires
                        SUBJECT=Alerte ruche 6
                        TITLE=Alerte problème réception données ruche
                        TEXT=Salut,<br>Ici le raspberry. <br>C'est la ruche n° 6 <br>Il y a un problème de réception de données.<br> Cela fait plus de 10 minutes qu'elle n'a rien émis!
                        FILELIST=

                        puis il supprime le fichier une fois lu et procède à l'envoi du mail!

                        voici le contenu de sendmail_simple :

                        <?php
                        #Reçoit en entrée un fichier contenant tout le nécessaire pour envoyer l'email sans accès à la base de données.
                        require_once ("./libmail.php");
                        
                        
                        function readparam($paramfile)
                        {
                        	$result=new stdclass();
                        	$result->DEST=array();
                        	$result->SUBJECT="";
                        	$result->TITLE="";
                        	$result->TEXT="";
                        	$result->ATTACHEMENTLIST=array();
                        	$result->CR="0";
                        	$result->MSG="";
                        
                        	
                        	if (!file_exists($paramfile))
                        	{
                        		$result->MSG="Fichier ".$paramfile." absent\r\n";
                        		$result->CR=-1;
                        		return $result;
                        	}
                        	$hdl=fopen($paramfile,"r");
                        	if (!$hdl)
                        	{
                        		$result->MSG="Fichier ".$paramfile." impossible à ouvrir\r\n";
                        		$result->CR=-2;
                        		return $result;
                        	}		
                           $d="";  //DESTINATAIRES//
                           $listefile="";   //LISTE PJ//
                           while (($line = fgets($hdl)) !== false) 
                           {
                        	   $line = str_replace(array("\r", "\n"), '', $line);
                               $t=explode("=",$line);
                        	   if (count($t)>=2)
                        	   {
                        		   $varname=strtoupper($t[0]);
                        		   //parce que la valeur peut contenir des =
                        		   array_shift($t);
                        		   $varval=trim(implode("=",$t));
                        		   if ($varname=="DEST") $d=$varval;
                        		   elseif ($varname=="SUBJECT") $result->SUBJECT=$varval;
                        		   elseif ($varname=="TEXT")   $result->TEXT=$varval;
                        		   elseif ($varname=="FILELIST") $listefile=$varval;
                        	   }
                           }
                           fclose($hdl);
                           $i=0;
                           $td=explode(",",$d);
                           foreach($td as $bcc) 
                           {
                        	   if (filter_var($bcc, FILTER_VALIDATE_EMAIL) === false) { $bcc=""; }
                        	   if ($bcc!="") 
                        	   { 
                        			if (!in_array($bcc,$result->DEST)) $result->DEST[$i]=$bcc; $i++; 
                        		} 
                           }
                        
                        /*****************************/
                           $tf=explode("|",$listefile);
                           $i=0;
                           foreach($tf as $fic) 
                           {
                        	   if (file_exists($fic) === false) { $fic=""; }
                        	   if ($fic!="") 
                        	   { 
                        			if (!in_array($fic,$result->ATTACHEMENTLIST)) $result->ATTACHEMENTLIST[$i]=$fic; $i++; 
                        		} 
                           }
                        
                        /*****************************/
                        	if (($listefile!="") and (count($result->ATTACHEMENTLIST)==0))
                        	{
                        		$result->MSG=$listefile." ne contient pas de fichiers existant !\n";
                        		$result->CR=-2;
                        		return $result;
                        	}		   
                        		
                        	if (count($result->DEST)==0)
                        	{
                        		$result->MSG="DEST ne contient aucune adresse email valide\n";
                        		$result->CR=-2;
                        		return $result;
                        	}		   
                        		
                        	elseif ($result->SUBJECT=="")
                        	{
                        		$result->MSG="SUBJECT vide\n";
                        		$result->CR=-2;
                        		return $result;
                        	}	
                        
                        	elseif ($result->TEXT=="")
                        	{
                        		$result->MSG="Texte vide\n";
                        		$result->CR=-2;
                        		return $result;
                        	}		
                        	return $result;
                        }
                        
                        
                        $SMTPSERVER="smtp.gmail.com";
                        $SMTPPORT="587";
                        $SMTPUSER="mon adresse mail";
                        $SMTPPASS="kmon mot de passe";
                        $SMTPAUTH="y"; // ou n
                        $SMTPSECURE="tls"; // ou tls ou vide
                        $ACUSERECEPTION="N"; // ou Y
                        $DESTLIST=array();
                        $COPYLIST=array();
                        $FROM="mail expéditeur";
                        
                        
                        $msg="";
                        $infile="";
                        if (($msg=="") and (!isset($argv[1]))) $msg="Absence du nom du fichier a traiter";
                        else $infile=$argv[1];
                        if (($msg=="") and  (!file_exists($infile))) $msg="Fichier ".$infile." a traiter inexistant ";
                        
                        if ($msg!="") 
                        {
                        	echo("\r\nmsg:".$msg."\r\n");
                        	die();
                        }
                        $r=readparam($infile);
                        if ($r->CR!="0") $msg=$r->MSG;
                        
                        if ($msg!="") 
                        {
                        	echo("\r\nmsg:".$msg."\r\n");
                        	die();
                        }
                        else
                        	echo("CTRL OK\r\n");
                        
                        if ($msg=="")
                        {
                        	$title=$r->TITLE;
                        	$subject=$r->SUBJECT;
                        	$tbto=array_merge($r->DEST,$COPYLIST);
                        	$hbody ="<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'><html>";
                        	$hbody.="<head><title>".$title."</title></head>";
                        	$hbody.="<body>".$r->TEXT."<br><br>";
                        	$hbody.="<p><i>Ce courrier électronique est envoyé automatiquement</i>";
                        	$hbody.="</body></html>";
                        	$r=envoie_mail_secure($SMTPSERVER,$SMTPPORT,$SMTPUSER,$SMTPPASS,$SMTPAUTH,$SMTPSECURE,$r->DEST,$FROM,$COPYLIST,$subject,$hbody,$r->ATTACHEMENTLIST,$ACUSERECEPTION);
                        	if ($r->CR!="0")
                        	{
                        		echo ($r->MSG);
                        		//@unlink($infile);
                        	}
                        	else
                        	{
                        		echo ("Envoie réussi de ".$subject." à ".implode(";",$tbto)."\r\n");
                        		@unlink($infile);
                        	}
                        }	
                        ?>
                        


                        et il inclue le fichier libmail.php dont voici le contenu :

                        <?php
                        require_once ("./phpmailer/PHPMailerAutoload.php");
                        
                        //transforme : nom<mail>
                        // en : $result->name et $result->mail
                        function MkAddressName($str)
                        {
                        	$r=new stdclass();
                        	$r->NAME="";
                        	$r->EMAIL="";
                        	$pos1 = strpos($str, "<");
                        	$pos2 = strpos($str, ">");
                        	//pas de séparateur <>
                        	if (($pos1===FALSE) and ($pos2===FALSE))
                        		$r->EMAIL=$str;
                        	else
                        	{
                        	   $r->NAME=substr($str,0,$pos1);
                        	   $r->EMAIL=substr($str,($pos1+1),strlen($str)-$pos1-2);
                        	}
                        	$pos3=strpos($str, "@");
                        	if (($r->NAME=="") and ($pos3!==FALSE)) $r->NAME=substr($str,0,$pos3);
                        	return $r;
                        }
                        
                        /**********************************************************/
                        /* EMAIL                                                  */
                        /**********************************************************/
                        function envoie_mail_secure($smtpserver,$smtpport,$smtplogin,$smtppass,$smtpauth,$smtpsecure,$listdestinataire,$from,$copy,$subject,$body,$filenamelist,$withar="N")
                        {
                        	$result=new stdclass();
                        	$result->CR="0";
                        	$result->MSG="";
                        	if (count($listdestinataire)==0) 
                        	{
                        		$result->CR=-1;
                        		$result->MSG="Il manque un destinataire au mail";
                        		return $result;
                        	}
                        	$f=MkAddressName($from);
                        	
                        	$mail = new PHPMailer(true);
                        	$mail->CharSet = 'utf-8';
                        	$mail->isSMTP();
                        	$mail->SMTPDebug  = 4;
                        	$mail->Host       = $smtpserver;	
                        	$mail->Port       = $smtpport;
                        	$mail->SMTPAuth   = ((strtoupper($smtpauth)=="Y") and ($smtplogin!="") and ($smtppass!=""));
                        	$mail->SMTPSecure = ($mail->SMTPAuth===TRUE?$smtpsecure:"");
                        	$mail->Username   = $smtplogin;
                        	$mail->Password   = $smtppass;
                        	//Emetteur
                        	$mail->addReplyTo($f->EMAIL, $f->NAME);
                        	$mail->setFrom($f->EMAIL, $f->NAME);
                        	//Accusé réception :
                        	if ($withar!="N") $mail->ConfirmReadingTo = $f->EMAIL;
                        	
                        	//destinataire, si plusieurs : en BCC
                        	if (count($listdestinataire)>1)
                        	{
                        		foreach($listdestinataire as $dest)
                        		{
                        			$d=MkAddressName($dest);
                        			$mail->addBCC($d->EMAIL, $d->NAME);
                        		}
                        	}
                        	else
                        	{
                        		$d=MkAddressName($listdestinataire[0]);
                        		$mail->addAddress($d->EMAIL, $d->NAME);
                        	}
                        	//copie (destinataires en clair)
                        	if (count($copy)>0)
                        	{
                        		foreach($copy as $dest)
                        		{
                        			$c=MkAddressName($dest);
                        			$mail->addCC($c->EMAIL, $c->NAME);
                        		}
                        	}	
                        	$mail->Subject  = $subject;
                        	$i=strripos($body,"<body>");
                        	$mailversion="TEXTE";
                        	if ($i===FALSE)
                        		$body="<body>".nl2br($body)."</body>";
                        	else $mailversion="HTML";
                        	
                        	$mail->msgHTML($body, dirname(__FILE__), true); //Create message bodies and embed images
                        	
                        	// on attache le fichier au mail
                        	foreach ($filenamelist as $filename)
                        	{
                        		$mail->addAttachment($filename, basename ($filename));
                        	}	
                        	$ret=TRUE;
                        	$ret=@$mail->send();
                        	if ($ret!=TRUE) 
                        	{
                        		$result->CR=-1;
                        		$result->MSG="Erreur : lors de l'envoie du mail Veuillez réessayer plus tard ou contacter directement votre structure";
                        		return $result;
                        	}		
                        	return $result;
                        }
                        ?>
                        



                        Alors un include "/home/pi/script/sendmail_simple.php"; fonctionne sauf que le fichier sendmail_simple.php on doit lui passer le chemin du fichier contenant (contenu_mail.ini)  la liste des destinataires, le sujet, le texte,... et du coup il le trouve pas puisque je n'ai pas réussi à lui passer dans l'include.

                        il me retourne le message suivant provenant de sendmail_simple.php:

                        $msg="Absence du nom du fichier a traiter";

                        Sur une invite de commande je ferais :

                        pi@raspberrypi:~/script $ php -f /home/pi/script/sendmail_simple.php /home/pi/script/contenu_mail.ini

                        il me semble qu'il n'est pas possible de faire un include "chemin/fichier"+ paramètres (ici le nom du fichier qui contient les variables utiles)
                        A moins que?
                        sinon il faudrait réécrire le code complet pour ne plus passer par un fichier mais transmettre directement les infos dans le programme lui même avant l'include... un sacré boulot (surtout pour moi) sachant que les fichiers d'envois d'email ne sont bien évidemment pas de moi!
                        Merci
                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 mai 2022 à 16:34:39

                          Par rapport à ta question d'origine, il te faut inclure à la fin de ton fichier de surveillance les lignes de 105 à 160 de sendmail_simple. Il faut aussi bien sûr ajouter la ligne 3 de sendmail_simple dans ton fichier de surveillance et inclure la fonction readparam.

                          Alors ce n'est pas très complexe mais c'est vrai que cela fait un peu modifié tes fichiers d'origine.

                          Sinon tu en restes à ton option de début de lancement par bash avec 2 lignes de commandes php et au passage tu rediriges comme je t'ai indiqué ci-dessus les traces pour avoir une log de tes traitements.

                          A+

                          -
                          Edité par monkey3d 23 mai 2022 à 16:34:58

                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 mai 2022 à 20:08:23

                            Et si tu faisais include('sendmail.php') dans surveillanve.php puis tu appelles surveillance.php avec contenu_mail.ini comme parametre ?

                            Le script de sendmail ne renverra plus d'erreurs...

                            • Partager sur Facebook
                            • Partager sur Twitter
                              23 mai 2022 à 20:09:53

                              Si je résume, je dois inclure la ligne 3 (include de libmail.php) 

                              le fonction readparam lignes 6 à 101 et les lignes 105 à 160

                              bref faire à part le<?php de début et la balise de fin ?> qui existe déjà dans mon fichier d'origine, je fais un copié collé de tout le code!

                              Bon j'avais déjà eu l'idée ...

                              Je l'ai essayé mais cela ne fonctionne malheureusement pas mieux : j'ai toujours le message d'erreur issu de cette ligne 119 de code :

                              if (($msg=="") and (!isset($argv[1]))) $msg="Absence du nom du fichier a traiter";

                              Sinon oui l'option de rester avec mon code lancé depuis le fichier script existe toujours mais pour la suite (gestion de plusieurs ruches en problème elle ne fonctionnera plus) d'où ma quête d'une autre solution ou je puisse boucler sur l'envoi de plusieurs emails...

                              Merci

                              Bon c'est enfin bon grâce à vos conseils et ceux d'autres personnes bien avisées (le créateur du code d'origine : piper)!

                              J'ai intégré le code directement dans mon fichier et supprimé tout ce qui ne servait pas la fonction readparam, et fait quelques ajustements.

                              Merci

                              -
                              Edité par GillesMangin-Voirin 24 mai 2022 à 9:13:00

                              • Partager sur Facebook
                              • Partager sur Twitter

                              comment lancer un fichier PHP depuis PHP?

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown