Les spécifications techniques des boucles en PHP et leur ressources serveur

petitfwanz Messages postés 12 Date d'inscription dimanche 11 avril 2010 Statut Membre Dernière intervention 12 août 2011 - 3 nov. 2010 à 22:54
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 - 11 nov. 2010 à 20:41
Bonjour,

Je cherche à en savoir plus sur les boucles en PHP avec un niveau avancé.
Utilisation des boucles sur des sites à fort traffic, il faut des fois privilégier une boucle par rapport à une autre.

Si quelqu'un sait où je peux avoir les documentations?

30 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
4 nov. 2010 à 03:06
Salut,

Ben là, faut regarder le code source de PHP.
Ou alors, de manière empirique : benchmarks.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
4 nov. 2010 à 08:18
..après ..site à fort trafic.. ça veut dire quoi ?? Avec répartition de charge ?? avec ou sans système de cache ??
A mon avis et d'après mon expérience, hélas, je dis bien hélas, le code est la dernière chose qu'on touche sur les sites à fort trafiic lorsqu'il a des ralentissements.
Donc honnetement, et ma réponse va peut-être te vexer, ta question a-t-elle un sens dans le contexte technologique actuel ?
S.
0
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
4 nov. 2010 à 10:59
Peux tu détailler

--> LES BOUCLES FOR, WHILE, DO ?

--> ITERATIONS SUR UN TABLEAU ?

b) for($i = 0; $i < count($array); $i++) { /* ... */ }

c) foreach($array as $key => &$val) { /* ... */ }

d) foreach($array as $key => $val) { /* ... */ }

e) while(list($key, $val) = each($array)) { /* ... */ }

--> http://doophp.com/benchmark ou des benchs sur des CMS ?
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
4 nov. 2010 à 11:03
S++

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
4 nov. 2010 à 11:35
Salut,

Quand on se soucis des performances (en particulier pour les sites à fort trafic comme c'est le cas ici), alors on utilise pas PHP. Soit dit en passant, le logo de PHP est très révélateur de ses performances : c'est un éléphant. Pourquoi tenter de vouloir faire courir cet éléphant comme une gazelle ? Il n'y arrivera jamais.
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
4 nov. 2010 à 11:47
Je ne suis pas trop de l'avis TychoBrahe. Je fais des sites à fort trafic et en PHP ça tient.. A CONDITION de réfléchir sur l'architecture global et d'arrêter de penser que PHP n'est qu'un langage utilisé dans les garages par un étudiant qui a chopé 'PHP pour les Nuls' à la bibliothèque.
S.
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
4 nov. 2010 à 11:50
S++, encore une fois...

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
4 nov. 2010 à 13:28
Même en codant proprement et bien ce n'est pas ça qui vas empêcher que ton code PHP soit d'abord recompilé en bytecode puis que ce bytecode soit exécuté par PHP. Au mieux tu dois pouvoir faire en sorte de garder ton bytecode afin d'éviter d'avoir à refaire la très lourde étape de compilaton (je n'ai jamais essayé et je ne sais aps si c'est possible)... mais quand on en est à faire un maximun d'économies ça reste pas top.

<?php

class Node
{
  private	$childNodes;
  private	$data;

  public function	__construct($data)
  {
    $this->data = (string)$data;
    $this->childNodes = array();
  }

  public function	display()
  {
    echo $this->data, PHP_EOL;
    foreach ($this->childNodes as $child)
      $child->display();
  }

  public function	addChild(Node $child)
  {
    $this->childNodes[] = $child;
  }

  public function	getNChild($n)
  {
    if (!is_int($n))
      throw new Exception('whatever');
    if ($n < 0 || $n >= sizeof($this->childNodes))
      throw new Exception('whatever bis');
    return $this->childNodes[$n];
  }
}

$root = new Node('Root');
$root->addChild(new Node('toto'));
$root->addChild(new Node('titi'));
$root->addChild(new Node('tutu'));
$root->getNChild(1)->addChild(new Node('plop'));
$root->display();

?>


#include 
#include <vector>

class Node
{
private:
  std::string		_data;
  std::vector<Node>	_childNodes;
  Node() {};

public:
  Node(const std::string data) { _data += data; };
  Node(const Node &cp)
  {
    if (&cp != this)
      *this = cp;
  };
  ~Node() {};

  Node	&operator=(const Node &r)
  {
    _data = r._data;
    _childNodes = r._childNodes;
    return *this;
  };

  void	display()
  {
    std::cout << _data << std::endl;
    for (unsigned int i = 0; i < _childNodes.size(); i++)
      _childNodes[i].display();
  };

  void	addChild(const Node &child)
  {
    _childNodes.push_back(child);
  };

  void	addChild(const Node *child)
  {
    _childNodes.push_back(*child);
  };

  Node	&getNChild(unsigned int n)
  {
    if (n >= _childNodes.size())
      throw std::exception();
    return _childNodes[n];
  };
};

int
main()
{
  Node	root("Root");

  root.addChild(new Node("toto"));
  root.addChild(new Node("titi"));
  root.addChild(new Node("tutu"));
  root.getNChild(1).addChild(new Node("plop"));;
  root.display();
  return 0;
}


tycho@uraniborg-> g++ plop.cpp
tycho@uraniborg-> time ./a.out >/dev/null 

real	0m0.005s
user	0m0.000s
sys	0m0.004s
tycho@uraniborg-> time php plop.php >/dev/null 

real	0m0.103s
user	0m0.068s
sys	0m0.028s


Là ya pas photo, quand on est rendu à faire des économies de bouts de ficelle faut vraiment changer de langage, PHP c'est pas fait pour la perf.
... et encore j'ai pas mis de flags d'optimisation.

Allez on va dire que c'est peut être juste parce que PHP est un peu lourd au lancement, testons avec juste une petite boucle en plus (l'ajout du noeud "plop" effectué 1000 fois au lieux de 1 seule)
tycho@uraniborg-> g++ plop.cpp
tycho@uraniborg-> time ./a.out >/dev/null 

real	0m0.008s
user	0m0.008s
sys	0m0.000s
tycho@uraniborg-> time php plop.php >/dev/null 

real	0m0.132s
user	0m0.112s
sys	0m0.012s

Ba en fait non, même juste pour tourner PHP c'est vraiment lent...
0
petitfwanz Messages postés 12 Date d'inscription dimanche 11 avril 2010 Statut Membre Dernière intervention 12 août 2011
4 nov. 2010 à 16:32
C'est vrai je me suis peut être mal exprimé.
1 - Je parle de l'étape création @syndrael
2 - Je veux juste pouvoir privilégier une boucle par rapport à une autre pour des raisons de performances. ( Je ne parlais pas d'itérations mais je suis aussi intéressé) @COD57
3 - @SYNDRAEL tu as bossé sur des sites à fort traffic que me conseilles-tu?
4 - justement @SYNDRAEL je veux pouvoir être opérationnel sur des aspects un peu plus techniques orientés performance et optimisation de code

Exemple: J'ai travaillé sur un portail pour un client, il a été développé par pas mal de prestataires qui ne se sont pas souciés des performances et du futur de leurs applications.

Je veux éviter ça lorsque je bosse, connaitre ce qu'il faut pour ne pas me retrouver avec un code que je dois retravailler par couches en direct sur le serveur prod.

Par contre j'ai ouvert le sujet pour avoir des réponses objectives et non des critiques. Merci d'avance
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
4 nov. 2010 à 16:43
Si tu t'inquiètes des performances des boucles, alors, je vais me répéter : soit tu consultes le code de PHP, soit tu fais des benchmarks.

Mais la problématique n'est pas là. Si un site a été développé par plusieurs prestataires sans soucis des performances, ce ne sont pas les boucles utilisées qu'il faut optimiser, mais peut être simplement l'architecture complète du site : celui-ci est peut-être à reprendre à 0 si on veut bien faire.

En fait, il faut se plonger corps et âme dans le code pour voir les incohérences. J'imagine que certains consultants/freelances en ont fait leur spécialité.
Il faut traquer les boucles en doublon (souvent on récupère les données d'une Bdd dans un tableau, puis on affiche le contenu du tableau => 2 boucles au lieu d'une, c'est juste un exemple), les fonctions gourmandes, les expressions régulières mal écrites, et j'en passe. La liste de ce qu'il faut chercher n'est pas facile à faire, tant les développeurs peuvent faire preuve d'imagination quand il s'agit de plomber les performances d'un script.
Mais je pense sincèrement que se poser la question de "quelle boucle préférer à telle autre" est une perte de temps car la réponse ne se trouve pas là (sauf peut-être quand on a réglé tous les autres détails qui plombent les perfs).

Je veux éviter ça lorsque je bosse, connaitre ce qu'il faut pour ne pas me retrouver avec un code que je dois retravailler par couches en direct sur le serveur prod.

Quand je lis ça, je m'interroge : quelle sorte de contrainte peut obliger un développeur a modifier le code en direct sur un serveur de prod ? A mon avis aucune : on doit/peut TOUJOURS pouvoir passer par un serveur de test.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
petitfwanz Messages postés 12 Date d'inscription dimanche 11 avril 2010 Statut Membre Dernière intervention 12 août 2011
4 nov. 2010 à 17:13
Je suis tout à fait d'accord avec toi @neigedhiver .
Je posais la question par rapport a un entretien dans lequel on me demande de savoir ça :/
Personnellement, je fais en sorte de réfléchir énormément avant de coder afin de ne pas alourdir mon code ( après je n'est pas beaucoup d'expérience)

Mais vu que cette question était récurrente je me suis dis que peut être je devrais m'en soucier :/

Merci en tout cas pour vos réponses.
0
petitfwanz Messages postés 12 Date d'inscription dimanche 11 avril 2010 Statut Membre Dernière intervention 12 août 2011
4 nov. 2010 à 17:16
J'ai reçu ça dans ma newsletter ce livre de ENI. J'ai bien envi de m'y aventurer. [http://www.editions-eni.fr/...[nouveautes-technique ]ici]
0
petitfwanz Messages postés 12 Date d'inscription dimanche 11 avril 2010 Statut Membre Dernière intervention 12 août 2011
4 nov. 2010 à 17:52
Zut : http://www.editions-eni.fr/...[nouveautes-technique]
0
petitfwanz Messages postés 12 Date d'inscription dimanche 11 avril 2010 Statut Membre Dernière intervention 12 août 2011
4 nov. 2010 à 17:53
C'est mieux ainsi : http://bit.ly/cAU7HN
PHP - Améliorez la performance de vos applications
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
4 nov. 2010 à 20:41
Salut,


Neige++ :
Avant de chercher la petite bête qui n'influera que peu il faut s'intéresser à la structure du code, mettre en place des bench, ...
A mon avis seuls les bench check peuvent vraiment donner la réponse.
Il ne faut pas oublier non plus que le choix du "type" de boucle dépend de ce que l'on souhaite faire.

Je m'interroge :
C'est quoi un site à fort trafic ? (bis d'une question de Syndrael restée sans réponse)

@TychoBrahe :
PHP incapable de gérer un site à fort trafic ?
Je ne t'apprendrai bien sur rien, mais il y a des milliers de sites qui ont véritablement un fort trafic et qui utilisent PHP.
Facebook par exemple (je sais d'avance ce que tu vas me répondre), et il y en a bien d'autres.
Je doute fort que Petitfwanz approche le centième des requêtes de ce site.

Je n'y connais rien en C++, cela étant je comprends un peu le PHP, et je pense que l'exemple que tu nous donnes n'apporte pas grand chose :
PHP c'est vraiment lent...

0.132s c'est quoi humainement parlant ?
... ce n'est pas perceptible, et cela pour 1000 itérations, ce qui, tu le concevras, n'est que très peu fréquent dans un contexte web.
Ton exemple est par ailleurs très basique, je serai curieux de voir si l'écart reste le même lors de l'utilisation des fonctions natives (et "avancées") de PHP, dans un contexte WEB il va sans dire.
Tu oublies également de signaler une tonne d'avantages de PHP face aux langages de bas niveaux.
Les langages de haut niveau sont et seront l'avenir (c'est mon avis personnel à moi que je pense perso ^^)

Bref, je pense que tout ce thread relève du "parler pour ne rien dire", car il dépend d'une multitude de choses que nous ne connaissons pas (le code, l'infrastructure matériel, etc ... etc ...), ... et que ne pouvons objectivement pondérer.

Cordialement,

Kohntark -
0
petitfwanz Messages postés 12 Date d'inscription dimanche 11 avril 2010 Statut Membre Dernière intervention 12 août 2011
4 nov. 2010 à 20:54
^^ La bonne question "qu'est ce qu'un site à fort traffic",

Personnelement moi j'ai bossé sur un site qui accueille 3000 visites/jour mais comparé à Meetic ou Netlog j'ai bossé sur un petit site :P

Donc très bonne question.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
4 nov. 2010 à 21:15

Personnelement moi j'ai bossé sur un site qui accueille 3000 visites/jour mais comparé à Meetic ou Netlog j'ai bossé sur un petit site :P
Donc très bonne question.

Bah ouais c'est une bonne question (Syndrael prems !! ^^)

3000 visites/jour c'est déjà une sacrée charge, même si comme tu dis elle n'a rien de comparable avec les milliers de gros sites qui en ont bien plus.

PHP convient de fait parfaitement à ton contexte (clin d'oeil à TychoBrahe et son dédain de PHP )


Optimisation ?
=> il faut voir le code, pas s'interroger sur les millièmes de secondes qui pourraient être récupérés sur le "type" de boucle.


Cordialement,


Kohntark -
0
petitfwanz Messages postés 12 Date d'inscription dimanche 11 avril 2010 Statut Membre Dernière intervention 12 août 2011
4 nov. 2010 à 21:21
Après bon... 3000 visites/jour c'est un pic! Mais concrètement, 300 visites/jours donc là encore ça montre que.. pour moi il y avait du traffic mais pour un autre ce sera "bof.. pff noob!"
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
4 nov. 2010 à 21:33
Kohntark *= Kohntark

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
4 nov. 2010 à 21:51
php lent comme un éléphant d'accord ...
mais Facebook c'est en php ! et c'est gros ...
gros ... http://www.facebook.com/ajax/reg_birthday_help.php
0
Rejoignez-nous