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

Signaler
Messages postés
12
Date d'inscription
dimanche 11 avril 2010
Statut
Membre
Dernière intervention
12 août 2011
-
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
-
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

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
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à ;)
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
16
..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.
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
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 ?
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
S++

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
12
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.
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
16
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.
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
S++, encore une fois...

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
12
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...
Messages postés
12
Date d'inscription
dimanche 11 avril 2010
Statut
Membre
Dernière intervention
12 août 2011

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
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
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à ;)
Messages postés
12
Date d'inscription
dimanche 11 avril 2010
Statut
Membre
Dernière intervention
12 août 2011

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.
Messages postés
12
Date d'inscription
dimanche 11 avril 2010
Statut
Membre
Dernière intervention
12 août 2011

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]
Messages postés
12
Date d'inscription
dimanche 11 avril 2010
Statut
Membre
Dernière intervention
12 août 2011

Zut : http://www.editions-eni.fr/...[nouveautes-technique]
Messages postés
12
Date d'inscription
dimanche 11 avril 2010
Statut
Membre
Dernière intervention
12 août 2011

C'est mieux ainsi : http://bit.ly/cAU7HN
PHP - Améliorez la performance de vos applications
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
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 -
Messages postés
12
Date d'inscription
dimanche 11 avril 2010
Statut
Membre
Dernière intervention
12 août 2011

^^ 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.
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27

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 -
Messages postés
12
Date d'inscription
dimanche 11 avril 2010
Statut
Membre
Dernière intervention
12 août 2011

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!"
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Kohntark *= Kohntark

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
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