OVH Cloud OVH Cloud

"Bonne pratique" ou "Optimisation" : afficher une grosse variable texte ou plusieurs petites ?

19 réponses
Avatar
Damien
Bonjour,
Grâce à plusieurs conseils sur ce group et d'autres, je suis en train de
'nettoyer' mon code. Je m'intéresse aussi à faire en sorte que mes pages
"résultats de requête" soient les plus propres et rapides possibles.

Quelle est technique la plus propre (vitesse, mémoire...) :
Méthode 1 :
Récupérer un enregistrement,
Le travailler
L'afficher (echo)
Récupérer...

Méthode 2 :
Récupérer un enregistrement
Le travailler
L'ajouter au bout d'une variable
Récupérer...
[...]
Enfin : afficher la grosse variable.

Des idées ? Pistes ?

Merci d'avance !
--
Damien

">sigh< They must think we came down in the last service pack..."
BOFH

9 réponses

1 2
Avatar
Olivier Miakinen

Donc perso j'utilise des " en PHP pour générer du SQL (vu qu'en SQL,
c'est ' qu'on utilise)


Ok.

et j'utilise des ' en PHP pour le HTML (vu que c'est " qu'on doit
utiliser).


Ça aussi, on en a discuté plusieurs fois (quoique peut-être pas des
centaines de fois).

En HTML (SGML) :

<cit. http://www.w3.org/TR/html401/intro/sgmltut.html#h-3.2.2>
By default, SGML requires that all attribute values be delimited using
either double quotation marks (ASCII decimal 34) or single quotation
marks (ASCII decimal 39). Single quote marks can be included within the
attribute value when the value is delimited by double quote marks, and
vice versa.
</cit.>

En XHTML (XML) :

<cit. http://www.w3.org/TR/2004/REC-xml-20040204/#sec-common-syn>
[10] AttValue ::= '"' ([^<&"] | Reference)* '"'
| "'" ([^<&'] | Reference)* "'"
</cit.>

Dans un cas comme dans l'autre, il est tout aussi légitime d'utiliser
des ' en (X)HTML que des ". La légende selon laquelle c'est " qu'on doit
utiliser fait beaucoup de tort à la lisibilité des programmes PHP. Note
par ailleurs que la syntaxe avec ' n'a jamais posé aucun problème aux
navigateurs, même aussi vieux que Mosaic, Internet Explorer 6.0(¹) ou
Netscape 2.0.

Il y a d'ailleurs cela dans la doc la plus vieille que j'aie pu trouver
(HTML 2.0, novembre 1995) :

<cit. ftp://ftp.rfc-editor.org/in-notes/rfc1866.txt>
3.2.4. Attributes
[...]
* A string literal, delimited by single quotes or double
quotes and not containing any occurrences of the delimiting
character.
</cit.>

Àmha, cela pourrait même être inclus dans la FAQ.

--
Olivier Miakinen
(¹) J'aime bien glisser un petit troll de temps en temps.

Avatar
John Gallet
Re,

des ' en (X)HTML que des ". La légende selon laquelle c'est " qu'on doit
utiliser fait beaucoup de tort à la lisibilité des programmes PHP.


Je ne suis malheureusement pas capable de retrouver le contre exemple
démontrant cette légende, mais j'ai vraiment souvenir d'avoir résolu un
bug de production en changeant connement les ' par des " dans un
formulaire HTML. Je faisais à ce moment là de la génération de html
dynamique non pas par PHP (encore embryonnaire) mais en procédures
PL/SQL, donc avec des " uniquement pour définir les strings et ça me
gavait d'avoir à les échapper, donc j'utilisais des ' pour les attributs
html. Maintenant, je dois avouer que j'ai eut à travailler sur des
compatibilités 100% (1) y compris avec des navigateurs à la con genre
AOL (qui par exemple ne transmettait pas les HIDDEN à cette époque) ou
trucs encore plus "confidentiels" style IE sur Solaris Sparc (si, si, ça
existe, ou en tous cas ça a eut existé).

Donc j'ai parfaitement pu tomber sur un exemple (à la con)^13 d'un
navigateur utilisé pendant même pas 2 mois avant d'être patché, à
l'époque, il sortait une nouvelle version toutes les 2 semaines.

* A string literal, delimited by single quotes or double
quotes and not containing any occurrences of the delimiting
character.


1) Ca c'est la belle théorie. C'est toujours pareil : la légende est
aussi alimentée par les implémentations. Récemment, j'avais besoin de
faire appel à l'instruction include dans un fichier WSDL ce qui donne un
truc du genre :

<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://toto.titi.com">
<include schemaLocation="../ContexteClient/ContexteClient.xsd" />
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>

puis utilisation des types définis dans le .xsd.

La théorie dit alors que le namespace dans le .xsd doit être géré d'une
certaine manière, en pratique, il n'y a pas deux parseurs qui se
comportent de la même manière sur cette #@! d'instruction include.

2) Il est tout à fait possible que le bug que j'ai résolu ce faisant
incluait dans certain cas une ' dans la donnée et que je me fourvoie
depuis des années.

Une chose est sûre : avec des " dans les attributs, je n'ai jamais eut
de problèmes sur aucune version d'auncun navigateur, et j'en ai utilisé
une sacrée tétrachiée. Avec des ', je suis sûr d'en avoir eut, il y a
quelques années (et depuis je ne risque pas d'en avoir eut vu que je
n'en utilise plus).


Àmha, cela pourrait même être inclus dans la FAQ.
Ca roule.


JG

(1) mi 1998 je bossais aux US et le cahier des charges spécifiait une
compatibilité avec tous les navigateurs de la terre à partir des
fonctionnalités d'IE et Netscape 2.0, et c'était sacrément le boxon à
faire, avec les navigateurs mode texte des public-libraries entre
autres...

Avatar
Olivier Miakinen

[...] Je faisais à ce moment là de la génération de html dynamique
non pas par PHP (encore embryonnaire) mais en procédures PL/SQL, donc
avec des " uniquement pour définir les strings et ça me gavait
d'avoir à les échapper, donc j'utilisais des ' pour les attributs
html.


La raison pour l'avoir fait me semble excellente. Il ne faut jamais
se laisser gaver par les trucs moches et répétitifs.

Maintenant, je dois avouer que j'ai eu[] à travailler sur des
compatibilités 100% (1) y compris avec des navigateurs à la con genre
AOL (qui par exemple ne transmettait pas les HIDDEN à cette époque) ou
trucs encore plus "confidentiels" style IE sur Solaris Sparc (si, si, ça
existe, ou en tout cas ça a eu[] existé).


Ah oui, là tu as vraiment fait partie des vaillants pionniers.

[...]

2) Il est tout à fait possible que le bug que j'ai résolu ce faisant
incluait dans certain cas une ' dans la donnée et que je me fourvoie
depuis des années.


C'est vrai que ce genre de truc est possible aussi. Cela m'est arrivé
plus d'une fois de corriger un bug en croyant en corriger un autre.

Àmha, cela pourrait même être inclus dans la FAQ.
Ca roule.



Encore merci pour tout le travail que tu fais sur la FAQ.

(1) mi 1998 je bossais aux US et le cahier des charges spécifiait une
compatibilité avec tous les navigateurs de la terre à partir des
fonctionnalités d'IE et Netscape 2.0, et c'était sacrément le boxon à
faire, avec les navigateurs mode texte des public-libraries entre
autres...


J'ose à peine imaginer un tel cahier des charges aujourd'hui...
quoique... quand on demande la compatibilité avec IE6, c'est
peut-être aussi difficile qu'hier avec Netscape 4 et qu'avant-hier
avec les navigateurs de l'époque.

--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.


Avatar
nospam
Nadine St-Amand wrote:

la methode 1 (echo) est plus lente mais plus econome en memoire
la methode 2 (accumulation) est plus rapide puisqu'elle economise le
nombre d'echo, mais coute un petit peu plus cher a la memoire du serveur.


Et du coup la méthode 2 est plus lente pour un site ayant une forte
affluance.

--
Romuald Brunet, ICQ 33033393, http://mog.online.fr

Remplacez nospam par mon prénom pour me contacter par email

Avatar
Guillaume Bouchard
Damien wrote:
Ca c'est une autre question, que je suis d'ailleurs en train de me poser
:) Comment faire des beaux zindex... Pas trouvé de tutoriel, à propos.
Si tu as des conseils ?


http://phpinfo.net/articles/article_optimisation-mysql.html

C'est la base trés alleger de la theorie. Mais le truc c'est de
comprandre où les mettre et de savoir utiliser EXPLAIN.

Juste pour rebondir sur ta petite histoire, je me suis effectivement mis
aux simple quotes récement à la suite de divers débats sur ce groupe :)


Comme JG je suis partisant des " pour les SQL et des ' pour le reste.

--
Guillaume.

Avatar
Stephane Pineau
Le 31 May 2005 09:47:31 GMT, John Gallet écrivait:



Une chose est sûre : avec des " dans les attributs, je n'ai jamais eut
de problèmes sur aucune version d'auncun navigateur, et j'en ai utilisé
une sacrée tétrachiée. Avec des ', je suis sûr d'en avoir eut, il y a
quelques années (et depuis je ne risque pas d'en avoir eut vu que je
n'en utilise plus).


Le problème "classique", et qui n'est pas lié au navigateur, qui apparait
en utilisant les simples quotes pour encadrer les attributs HTML c'est si la
la variable qui sert à définir la valeur de cette attribut contient elle
même une quote (apostrophe), ce qui est relativement et statistiquement plus
courant que la présence de guillemets.

Ainsi :

$TitleImage="La place de l'espoir";
echo "<img src='./pic1.png' alt='$TitleImage'>";

Va génére le code HTML invalide suivant :

<img src='./pic1' alt='La place de l'espoir> l'infobulle s'arrêtant à la
1ère quote fermante n'affichera plus que - La place de l -

Le même problème peut subvenir avec des double-quotes, mais il est très
nettement moins problable d'avoir une valeur d'attribut contenant des
guillemets.

Autre syntaxe à problème l'absence totale de quotes double ou simple, ex: :
echo "<img src=./pic1.png al=$Titleimage">;
Dans ce cas de figure le alt n'affichera plus que - La - , le premier espace
rencontré étant considéré par la norme HTML comme le marqueur de fin de la
valeur d'un attribut en l'absence de toute quote.

Perso j'avais tendance à utliiser en connaissance de cause la sytaxe double
quote pour la chaine HTML à générer et donc simple quote pour les attributs
car elle évite la concaténation chaine/Variable (avec donc des simples et
doubles quotes qui se suivent), ou l'echapement systématique des doubles
quotes au sein de la chaine..

Le code en est plus lisible et si l'on prend le soin de remplacer
systématiquement les quotes par leur valeur en notation html hexa dans les
variables d'attribut avant leur utilisation, il y a peu de risques.

Cdlt,
Stéph'


--
AcroDict : Dictionnaire francophone des acronymes informatiques
<URL:http://www.teaser.fr/~spineau/acrodict/>
PHP Page : Script PHP3 Gratuits (Forum, Gestionnaires BDD, etc..)
<URL:http://steph.pineau.free.fr/php/index.php>

Avatar
Olivier Miakinen

Le problème "classique", et qui n'est pas lié au navigateur, qui apparait
en utilisant les simples quotes pour encadrer les attributs HTML c'est si la
la variable qui sert à définir la valeur de cette attribut contient elle
même une quote (apostrophe), ce qui est relativement et statistiquement plus
courant que la présence de guillemets.


Oui, mébon... si on était rigoureux au sujet de la typographie, la patte
de mouche qui sert d'apostrophe ascii ne devrait pas être utilisée sur
le web puisque la « vraie » apostrophe est accessible, soit directement
en utf-8, soit par &#8217; ou &#x2019;.

Ainsi :

$TitleImage="La place de l'espoir";
echo "<img src='./pic1.png' alt='$TitleImage'>";

Va génére le code HTML invalide suivant :

<img src='./pic1' alt='La place de l'espoir>


Pas de problème avec :
$TitleImage="La place de l&#8217;espoir";
(pas plus avec l'apostrophe courbe directement dans le code, mais je ne
peux pas donner l'exemple ici puisqu'il faut utf-8)

l'infobulle s'arrêtant à la
1ère quote fermante n'affichera plus que - La place de l -


Quoi ? Quelle infobulle ? Celle que l'infâme Internet Explorer affiche
sur un attribut alt alors qu'il s'agit d'un texte *alternatif*, censé ne
s'afficher que lorsque l'image ne s'affiche pas ? Pour cet usage,
utiliser l'attribut title -- et encore, il y a des puristes encore plus
intégristes que moi, ou encore plus barbus, pour dire que même le title
n'est pas censé donner une infobulle.

Le même problème peut subvenir avec des double-quotes, mais il est très
nettement moins problable d'avoir une valeur d'attribut contenant des
guillemets.


Même motif, même punition, sauf que là on peut aussi utiliser des
entités nommées. Éviter les "gants de toilettes" pour leur préférer de
vrais « guillemets » (avec espaces insécables).

Autre syntaxe à problème l'absence totale de quotes double ou simple, ex: :
echo "<img src=./pic1.png al=$Titleimage">;


Beurk ! À éviter absolument. Je sais que ce n'est pas toi qu'il faut
convaincre, mais d'éventuels lecteurs novices qui prendraient cette
syntaxe au premier degré comme « possible, mais avec problèmes ».

Cdlt,
Stéph'


À vos ordres, Commandant Stéphane.

--
Olivier Miakinen

Avatar
Etienne SOBOLE
Quelle est technique la plus propre (vitesse, mémoire...) :


A mon avis tu te poses une question qui n'a pas de sens.
Il n'y aura aucune différence notable avec les deux methodes, si ce n'est
que si tu bufferises, pendant tout le temps d'execution de ton script, rien
ne va s'afficher sur ta page.
du coup, apres un clic, ben l'utilisateur va attendre sans que rien ne se
passe...

au finale le temps total sera a peu pret le même. (voir pire parce que ce
que tu auras eventuellement gagné en cpu, l'utilisateur le perdra en bande
passante puisqu'il recevra d'un coup toute la page plutot qu'au fure et à
mesure...)
ce n'est pas la qu'il faut faire des optimisations.

Pour prendre une analogie, c'est comme dire.
est ce qu'une ferrari ira plus vite si on met un volant qui fait 200 gramme
de moins !!!

les micro-seconde que tu pourrais gagner vont être complètement bouffés par
l'acces à la base de données qui sera de toute façon plus lente que le
reste...

Etienne

Avatar
Damien
Quelle est technique la plus propre (vitesse, mémoire...) :



A mon avis tu te poses une question qui n'a pas de sens.


Visiblement si, au moins un : le sens interdit :)

Il n'y aura aucune différence notable avec les deux methodes, si ce n'est
que si tu bufferises, pendant tout le temps d'execution de ton script, rien
ne va s'afficher sur ta page.
du coup, apres un clic, ben l'utilisateur va attendre sans que rien ne se
passe...


Sauf si je bufferise à partir de la boucle, qui n'est appelée qu'en
milieu de page.

au finale le temps total sera a peu pret le même. (voir pire parce que ce
que tu auras eventuellement gagné en cpu, l'utilisateur le perdra en bande
passante puisqu'il recevra d'un coup toute la page plutot qu'au fure et à
mesure...)
ce n'est pas la qu'il faut faire des optimisations.


Je constate que ce n'est pas là effectivement qu'il faut que je
réfléchisse. En fait, je me suis posé la question suite à une
expérience, il y a longtemps, avec Delphi. Je remplissais une
TSTRINGLIST en utilisant la methode .add() jusqu'au jour ou j'ai divisé
par 100 le temps d'exécution en remplissant une variable texte et en
affectant à la fin ce texte (avec des retours chariot) à ma
TSTRINGLIST... De 1 min à moins d'une seconde...


Pour prendre une analogie, c'est comme dire.
est ce qu'une ferrari ira plus vite si on met un volant qui fait 200 gramme
de moins !!!


:)

les micro-seconde que tu pourrais gagner vont être complètement bouffés par
l'acces à la base de données qui sera de toute façon plus lente que le
reste...


Ca c'est vrai aussi... Je suis en train de me former sur les bons index :)

Merci !
--
Damien


1 2