Dams Posté 27 Novembre 2003 Posté 27 Novembre 2003 Bonjour, Je vous explique le contexte. J'ai un serveur semi-dedié en FreeBSD. Dessus je voudrais pouvoir faire tourner un 'gros' script en PHP trés consommateur en ressources... Seulement voila, je voudrais lancer ce script "que" si 50% des ressources sont dispo par exemple. La question est donc, existe t'il un moyen en PHP d'avoir ce genre d'info (Un peu comme la commande TOP en telnet) ? Merci...
Cariboo Posté 27 Novembre 2003 Posté 27 Novembre 2003 Juste pour mieux comprendre, quelles sont les "ressources" que ton script est censé utiliser : - mémoire ? - processeur ? - file handles ? - espace disque ? Sinon, je ne connais pas tout, mais je ne connais pas de fonction php permettant d'accéder à ce type d'infos. Ni d'extensions d'ailleurs. Mais il doit être possible d'exécuter depuis PHP un programme en langage évolué, ou un utilitaire pour récupérer l'info (avec shell_exec(), exec() etc...)... Les experts en FreeBSD nous donneront le truc définitif ... Remarque : en principe, un couple Apache/PHP est paramétré pour que chaque script php tourne dans une "boîte" limitée en ressources... Donc en pratique, tu atteint les limites des ressources allouées à ton script bien avant d'atteindre les limites de ressources du serveur.
Dams Posté 28 Novembre 2003 Auteur Posté 28 Novembre 2003 Juste pour mieux comprendre, quelles sont les "ressources" que ton script est censé utiliser :- mémoire ? - processeur ? - file handles ? - espace disque ? (...) Remarque : en principe, un couple Apache/PHP est paramétré pour que chaque script php tourne dans une "boîte" limitée en ressources... Donc en pratique, tu atteint les limites des ressources allouées à ton script bien avant d'atteindre les limites de ressources du serveur. Merci je pense au processeur.... Mais si tu me dis qu'un script est limité tout va bien ! Est-ce paramétrable ? Car mon script fait monter le processeur jusqu'a 60% durant 5-6 secondes... Donc je me demander si c'est pas plutôt risqué. D'autant plus qu'il s'agit d'un script pour un "futur" outil sur Yooda qui pourra être lancer par plusieurs utilisateurs.... Ce que je souhaite réaliser est une procédure de sécurité qui en cas d'une utilisation excessive des ressources de la machine renvoi vers un "Trop d'utilisateurs veuillez nous excusez "
Puma Noires Posté 29 Novembre 2003 Posté 29 Novembre 2003 Achète une machine plus puissante, ou du sun solaris avec des bi-proc en série
Dams Posté 29 Novembre 2003 Auteur Posté 29 Novembre 2003 Super Merci pour ta remarque!!! Tu m'aide pas trop la..... A moins que.... Je t'envoi une autorisation de prélévement. Et au moins ta remarque aura servi à quelque chose
Dan Posté 29 Novembre 2003 Posté 29 Novembre 2003 Salut Dams, La priorité d'un process ne pourra se paramétrer qu'avec PHP5 et la fonction proc_nice() Par contre, si tu as accès à l'appel exec, tu peux utiliser "nice" qui est une manière de donner à un processus une priorité plus haute/basse que la priorité standard. Ceci pour autant que ton hébergeur le permette... Comme tu es un "utilisateur lambda" (et non root) tu ne peux que baisser la priorité, ce qui est logique et correspond à ce que tu veux faire, à peu de choses près. Un script en priorité basse ne s'exécutera que si le CPU a du "idle time" et sera ralenti pour attribuer du temps machine à tout processus qui en fera la demande. Dan
Anonymus Posté 30 Novembre 2003 Posté 30 Novembre 2003 Bonjour, je ne m'y connais pas trop, mais n'est ce pas là qu'intervient la fonction virtual_host ?? Anonymus.
Dams Posté 30 Novembre 2003 Auteur Posté 30 Novembre 2003 Nan... Virtual ne permet pas de controler mon script Par contre pour la fonction proc_nice() bien joué Dan... Et j'ai même trouver comment le faire en PHP4: <?phpfunction proc_nice($priority) { exec("renice +$priority ".getmypid());}//You also need a shutdown function if you don't want to leave your http deamons with a modified priorityfunction exit_func(){ // Restore priority proc_nice(0);}register_shutdown_function('exit_func');?> Ca me paraît pas mal tout ca.... Avec ceci je peux donc mettre proc_nice(15) dans mon code pour que mon script ne risque pas de bloquer mon serveur. Il est alors non prioritaire. Et je fini par exit_func() pour restaurer la priorité de mon process.. Un process correspond a un appel de page ou plusieur ? Je ne risque pas de ralentir d'autre utilisateur avec cette methode ?
Dan Posté 1 Décembre 2003 Posté 1 Décembre 2003 Salut Dams, C'est vrai qu'il y a "renice" qui te permet de changer la priorité d'un process qui tourne déjà. Un process est simplement un programme exécutable, auquel du temps machine est attribué par un processus "superviseur" (le scheduler) en fonction de sa priorité et de la charge machine. En lancant un process avec la commande "nice" (ou en utilisant "renice") tu ne fais que donner instruction au chef d'orchestre (scheduler) d'attribuer plus ou moins de ressources à un processus spécifique. Il est clair que les ressources attribuées à un processus impactent l'ensemble du pool mais dans ton cas, comme tu règleras la priorité "à la baisse" tu laisseras plus de ressources pour les autres processus. Donc l'impact se fera dans le bon sens pour ceux-ci .... Dan
Anonymus Posté 1 Décembre 2003 Posté 1 Décembre 2003 Par contre pour la fonction proc_nice() bien joué Dan... Et j'ai même trouver comment le faire en PHP4: Hum, hum.... Rendons à César l'origine de la fonction : http://php.planetmirror.com/manual/en/function.proc-nice.php ou alors il y a des divins dans les parages Anonymus. ps : merci tout de meme de l'avoir trouvé !
Dams Posté 1 Décembre 2003 Auteur Posté 1 Décembre 2003 Oui... J'ai pas dit que je l'avais inventé Et puis moi j'utilise l'original http://fr2.php.net/manual/fr/function.proc-nice.php
Anonymus Posté 9 Décembre 2003 Posté 9 Décembre 2003 Avec la fonction renice, il est possible de faire tourner un script en continu sur un serveur mutualisé, sans se faire lyncher par son hébergeur. Ainsi : J'ai un script qui tourne pendant 6-8 heures, sans discontinuer, et tous les jours de la semaine depuis dix jours, et mon hébergeur ne m'a toujours rien dit. pas de dépassements de hits, pas de probleme sql, rien... Enfin.. rien d'anormal. Apparemment, effectivement, avec la fonction 'renice', parametrée à 18, fait que mon script passe toujours en dernier dans l'ordre des executions. Mais c'est pas trop génant. Puisqu'il ne s'arrete pas A+, Anonymus.
Dan Posté 9 Décembre 2003 Posté 9 Décembre 2003 Salut Anonymus, J'imagine qu'il ne s'agit pas d'un script php, parce qu'il aurait atteint depuis longtemps le 'max_execution_time' paramétré par défaut à 30 secondes Pour lever toute limite, il faudrait le paramétrer à 0 et je ne connais pas d'hébergeur l'ayant fait. Certains, comme Free et Online l'abaissent même (8 secondes pour Online) Dan
Dams Posté 9 Décembre 2003 Auteur Posté 9 Décembre 2003 anonymus tu fait donc ca en PHP 5 ? Sinon POUR LE TIMEOUT c'est contournable: Lorsqu'elle est appelée, la fonction set_time_limit() remet le compteur de zéro. En d'autres termes, si la limite par défaut est à 30 secondes, et qu'après 25 secondes d'exécution du script l'appel set_time_limit(20) est fait, alors le script tournera pendant un total de 45 secondes avant de finir. (http://fr2.php.net/manual/fr/function.set-time-limit.php) Sinon pour en revenir au sujet initial je vais pouvoir arriver a gerer ma charge reseau grace a renice + un contrôle du nombre maximum d'utilisateur simultané. En effet, j'ai peur que mon script soit victime de son succès Par contre a priori la fonction proc_nice cité ci dessous ne me permet pas de remettre le process a une priorité normal une fois le script fini..
Anonymus Posté 9 Décembre 2003 Posté 9 Décembre 2003 Désolé de vous décevoir, mais :: C'est tout en php, et Amen n'est pas encore au php 5. et mon script tourne actuellement depuis hier soir sans s'arreter. Je suis pas sûr de comprendre le script (et j'ai pas eu le temps de l''etudier'), mais apparemment, ca vient bien du 'renice'. //low priority if allowed print _AT_exec('renice 18 '.getmypid()).$br; et c'est tiré du 'spider' de phpdig, un moteur de recherche tout en php. ps : et tant qu'à faire, c'est pour faire un moteur de recherche spécialisé sur le php... à l'adresse :=>labonneadresse.com. je vais me renseigner chez le constructeur du script, et vous en dit plus. Anonymus.
Anonymus Posté 10 Décembre 2003 Posté 10 Décembre 2003 Bon.... En fait, il s'agit de la fonction set_time_limit, qui permet de faire fonctionner un script pendant la période indiquée en parametre. Exemple : set_time_limit(86400); permet de le faire marcher pendant 1 journée. Plus d'infos ? => http://dev.nexen.net/docs/php/annotee/func...-time-limit.php Voilà... Ca ne répond pas à la question de charge du serveur, mais peut y remédier. Et c'est en php3 et 4. A+, Anonymus.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant