Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2867 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP][Resolu] Envoyer un signal à un processus depuis une page PHP ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP][Resolu] Envoyer un signal à un processus depuis une page PHP ?

n°1883411
nlc
Le mieux est l'ennemi du bien
Posté le 11-05-2009 à 19:45:36  profilanswer
 

Bonsoir à tous  :hello:  
 
Je travaille sur une petite carte linux embarqué (coeur ARM9) dont le système de fichier est sur nand flash, en jffs2.
 
Mon application utilise des paramètres qui sont stockés dans une base de données sqlite. A côté de ça j'ai crée une interface web en php qui permet de modifier les paramètres de l'application.
 
J'ai besoin d'être assez réactif entre la modification des parametres par l'interface web et la prise en compte de ces nouveaux parametres par l'application.
Du coup actuellement dans mon application je viens raffraichir ma table de parametres depuis la base de donnée toutes les 5 secondes.
 
Ca fonctionne très bien, mais ce principe me gene, car bien que je fasse uniquement des lecture, sqlite fait des accès disque en ecriture (pour ses fichiers temporaires). Et des accès disque toutes les 5 secondes je voudrais eviter pour pas bousiller prématurement la mémoire flash.
 
Mon idée serait de ne recharger les parametres depuis la base de données uniquement quand ils ont changé. Pour faire ça, dans mon interface PHP, après avoir fait une ecriture dans la base de données, je voudrais que le script PHP envoie un signal à mon application, pour lui dire de recharger les parametres.
 
Du côté de mon application, tout est prêt ! j'ai capturé le signal SIGUSR1, et quand j'envoie ce signal au processus, il fait bien son raffraichissement des parametres.
 
Maintenant là où je coince, c'est du côté du php. Comment envoyer le signal à mon processus, et avant de faire ça, comment récupérer le n° de processus de mon application ?
 
Une idée ?
Bonne soirée  :)


Message édité par nlc le 11-05-2009 à 21:43:55

---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
mood
Publicité
Posté le 11-05-2009 à 19:45:36  profilanswer
 

n°1883443
nlc
Le mieux est l'ennemi du bien
Posté le 11-05-2009 à 21:43:31  profilanswer
 

Bon je me réponds à moi même j'ai fini par trouver la solution tout seul.
 
C'est tout con en fait il suffit de faire ça dans le script php :
 

Code :
  1. system( "pkill -SIGUSR1 nomDuProgramme" );


 
Du coup c'est top je ne vient recharger mes paramètres depuis la base de données uniquement si au moins l'un d'en eux a été changé par l'interface web 8)
 
La flash nand peut me dire merci :D


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°1883724
skeye
Posté le 12-05-2009 à 15:10:29  profilanswer
 

tu as posix_kill pour ça plus proprement, a priori ;)
 
http://fr.php.net/manual/en/function.posix-kill.php


---------------
Can't buy what I want because it's free -
n°1883728
skeye
Posté le 12-05-2009 à 15:15:45  profilanswer
 

(...bon après faut voir si tu peux récupérer facilement le pid de ton process...[:joce])


---------------
Can't buy what I want because it's free -
n°1883781
nlc
Le mieux est l'ennemi du bien
Posté le 12-05-2009 à 16:45:06  profilanswer
 

skeye a écrit :

(...bon après faut voir si tu peux récupérer facilement le pid de ton process...[:joce])


Effectivement, ta fonction serait mieux, mais comment récupérer le n° de processus directement depuis php ?  :??:


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°1883794
skeye
Posté le 12-05-2009 à 17:18:08  profilanswer
 

nlc a écrit :


Effectivement, ta fonction serait mieux, mais comment récupérer le n° de processus directement depuis php ?  :??:


ça n'a pas l'air faisable, après avoir jeté un oeil rapidement aux fonctions posix_*...donc ta solution est probablement le plus simple...;)


---------------
Can't buy what I want because it's free -
n°1883817
nlc
Le mieux est l'ennemi du bien
Posté le 12-05-2009 à 17:51:11  profilanswer
 

J'avais jeté un oeil aussi sur la liste des fonctions posix du coup, mais y a rien pour trouver le pid d'un processus par son nom.
 
En tout cas ça tourne depuis tout à l'heure sans problème !  
 
Je suis même allé plus loin que ça. Dans mon application j'ai des variables de fonctionnement que je dois afficher à l'utilisateur sur l'interface web.
 
J'utilisais le même système qu'au départ, l'application venait mettre à jour régulièrement une table dans la bdd, et l'interface venait taper dedans pour afficher les valeurs à l'utilisateur.
 
Maintenant dans le script PHP qui m'affiche les valeurs, juste avant de faire la lecture des valeurs dans la bdd j'envoie le signal SIGUSR1 à l'application et je fais un sleep de 0.5 seconde.
 
Du coup l'appli recoit le signal et a le temps de mettre à jour la bdd avec les dernières valeurs en cours avant que le script php n'y accède pour les récupérer et les afficher !
 
Et le temps de latence de 0.5 seconde n'est pas génant du tout.
 
L'appli est donc capable de recevoir 2 signaux, un pour raffraichir la table des valeurs à afficher à l'utilisateur sur la page web, et l'autre pour venir recharger la table des paramètres quand au moins un parametre a été modifié par l'utilisateur.


Message édité par nlc le 12-05-2009 à 17:52:24

---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°2115394
loicdouill​et
Posté le 07-12-2011 à 16:37:24  profilanswer
 

Bonjour,
 
J'essaie de faire la meme manipulation que vous en essayant de tuer un processus avec la commande system dans php. Cependant, ca ne fonctionne pas le processus reste actif. J'ai vérifié que je ne suis pas en Safe_mode. Je pense que cela vient des droits attribués par apache2. Le problème est que mon système est démarré en mode root et que je n'arrive quand meme pas à utiliser la fonction system("kill -SIGUSR1 NomProg" );   . Alors que quand j'utilise la meme commande "kill -SIGUSR1 NomProg" dans un terminal, ca fonctionne...
 
Merci d'avance de votre aide
 
Bien cordialement

n°2115400
nlc
Le mieux est l'ennemi du bien
Posté le 07-12-2011 à 17:14:12  profilanswer
 

Je pense en effet que le souci c'est que le script php tourne avec les droits apache et donc la commande kill n'a pas les droits suffisants pour tuer le processus qui doit tourner en mode root.
 
Je pense que la solution c'est que le processus à tuer soit lancé avec les droits apache par exemple. C'est quoi ce processus et il est lancé comment ?


Message édité par nlc le 07-12-2011 à 17:14:23
n°2115405
loicdouill​et
Posté le 07-12-2011 à 17:23:17  profilanswer
 

Tout d'abord merci pour votre réponse!!
 
mon processus est un programme que j'ai écrit qui, pour le moment, est une boucle infini qui capte avec la fonction sigaction le signal SIGUSR1, et lorsque c'est le cas, il affiche un message sur le terminal. ce programme fonctionne bien vu que lorsque j'utilise la commande pkill sur le terminal directement, il m'affiche le bon message.  
 
En revanche savez vous comment changer les droits en droits apache justement??? (PS: j'utilise le paquage XAMPP qui regroupe les différents modules apache2, php5, mysql...)
 

mood
Publicité
Posté le 07-12-2011 à 17:23:17  profilanswer
 

n°2115408
nlc
Le mieux est l'ennemi du bien
Posté le 07-12-2011 à 17:31:56  profilanswer
 

Ouais donc c'est bizarre car si c'est pas pour tuer le processus mais envoyer un SIGUSR1, ça devrait pourtant fonctionner !?
 
Verifiez peut être si par hasard y a pas une config dans php qui empêche d'utiliser la commande system() ?


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°2115424
loicdouill​et
Posté le 07-12-2011 à 17:56:18  profilanswer
 

j'ai vérifié justement et je n'ai pas trouvé. j'essaie également avec la fonction exec() mais en vain...

n°2115427
nlc
Le mieux est l'ennemi du bien
Posté le 07-12-2011 à 18:09:14  profilanswer
 

Essayez peut être l'exemple #1 ici : http://php.net/manual/fr/function.system.php
Ca permettrait de voir si la commande ls est bien executée grâce à la fonction system.
 


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°2115429
loicdouill​et
Posté le 07-12-2011 à 18:18:36  profilanswer
 

Oui la fonction tourne bien avec system() ca m'affiche les fichiers présent dans le répertoire courant. Lorsque je fais un "touch toto" ca fonctionne aussi. mais c lorsque je veu faire un kill, ou pkill ca ne fonctionne pas... peut etre il ne trouve pas mon programme (avec kill je rentre carement le PID du processus)

n°2115431
nlc
Le mieux est l'ennemi du bien
Posté le 07-12-2011 à 18:37:22  profilanswer
 

moi j'utilise pkill car c'est plus pratique d'utiliser le nom, mais je suis sur un système embarqué j'ai pas les mêmes soucis pour les droits.
Essayez peut être dans une console de lancer votre processus en tant que apache pour voir si dans ce cas il reçoit bien le signal ?  
En étant root puis en faisant su apache (ou le nom correspondant au serveur web) ça devrait permettre de lancer le processus en tant qu'apache.


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°2115464
FranceDenB​as
1 dépense = 1 socialiss' :o
Posté le 08-12-2011 à 09:21:21  profilanswer
 

Sinon sans s'embêter à tourner en Apache, procédons plus simplement :
 

loicdouillet a écrit :

Oui la fonction tourne bien avec system() ca m'affiche les fichiers présent dans le répertoire courant. Lorsque je fais un "touch toto" ca fonctionne aussi. mais c lorsque je veu faire un kill, ou pkill ca ne fonctionne pas... peut etre il ne trouve pas mon programme (avec kill je rentre carement le PID du processus)


 
Que retourne exactement la fonction system sur kill et pkill ?
sa valeur de retour (sortie standard de la commande) et quelle est la valeur de l'entier de retour (valeur de retour de la commande) cf :

Citation :


string system ( string $command [, int &$return_var ] )


 
:??:


Message édité par FranceDenBas le 08-12-2011 à 09:26:59

---------------
"Il a inventé le bougisme : je bouge donc je suis" :sol: - Dupont-Aignan à propos de Son Altesse Sérénissime Sarkal 1er. Merci Handsome Devil et Meriadeck.
n°2115473
nlc
Le mieux est l'ennemi du bien
Posté le 08-12-2011 à 10:33:44  profilanswer
 

oui je pense que c'est un bonne chose à tester !!


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°2115687
loicdouill​et
Posté le 09-12-2011 à 10:01:15  profilanswer
 

Bonjour, et merci encore pour vos réponses.
 
J'ai réussi à résoudre mon problème. c'était bien un problème de droit. En effet, apache sous Lampp (xampp) se lance sous l'utilisateur "nobody"  (utiliser la fonction php echo system('whoami'); pour connaitre le nom d'utilisateur. Je suis allé dans le fichier de configuration httpd.conf (envvars pour d'autre version de apache2). et j'ai changer la ligne correspondant à USER par mon nom d'utilisateur (mais pas en root car ca ne fonctionne pas => sécurité).  
J'ai fais un chown nomdutilisateur monprogramme  permettant de donner l'apartenance à nomdutilisateur du fichier. Et maintenant quand je lance le programme sous 'nomdutilisateur', le signal est bien intercepté par la commande php system(pkill -SIGUSR1 nomprogramme);
 
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP][Resolu] Envoyer un signal à un processus depuis une page PHP ?

 

Sujets relatifs
[PHP] Matrice phpRequete SQL , PHP et Date (mois)
[résolu] Div en overflow:auto, garder le focus en bas ?[Résolu] Problème d'échappement d'apostrophes
[PHP/mySQL] Different resultat d'une equete SQL entre PHP / phpMyAdmin[Php] Menu
Générer des schémas avec textes dans page web[résolu] problème de débutant
[Résolu] Alerte emailFixer la largeur maximale des lignes d'une page HTML
Plus de sujets relatifs à : [PHP][Resolu] Envoyer un signal à un processus depuis une page PHP ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR