Précédent   Forum du club des développeurs et IT Pro > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 02/03/2005, 22h29   #141
genova
Membre chevronné
 
Avatar de genova
 
Inscription : septembre 2004
Messages : 487
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 487
Points : 602
Points : 602
Envoyer un message via MSN à genova
Optimise ton script ...
__________________
Testez le forum Fire Soft Board, un forum libre, gratuit et français.

Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.
genova est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2005, 09h53   #142
vynarim
Invité de passage
 
Inscription : mars 2005
Messages : 2
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 2
Points : 2
Points : 2
L'optimisation n'est pas évidente.

Peux t on grouper en mysql un envoi de requetes ?
En fait mon script fais 60 fois la meme étape (calculs divers) pour à chaque fois faire un update d'une ligne d'une table (ligne différente à chaque fois)

Peut etre serait il possible d'atttendre d'avoir toutes les requetes pour les envoyer en une fois à la base ?
vynarim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2005, 14h45   #143
genova
Membre chevronné
 
Avatar de genova
 
Inscription : septembre 2004
Messages : 487
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 487
Points : 602
Points : 602
Envoyer un message via MSN à genova
Tu peux faire un copie colle de ton script ici qu'on voye ce qu'il y a a optimiser ?
__________________
Testez le forum Fire Soft Board, un forum libre, gratuit et français.

Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.
genova est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2005, 21h52   #144
Celelibi
Membre émérite
 
Avatar de Celelibi
 
Inscription : janvier 2004
Messages : 1 060
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 1 060
Points : 910
Points : 910
J'ai eut besoin il y a quelques jours de tester si la solution utilisant MySQL était plus rapide que la solution utilisant PHP.

Ma question était de tester si une ligne existait dans une table. Il ne pouvait y avoir au maximum qu'une seul ligne.
Donc vallait-il mieux sélectionner la ligne et tester son existance avec mysql_num_rows(), ou alors utiliser la fonction COUNT() de MySQL, puis ensuite récupérer un tableau avec mysql_fetch_array puis en extraite la valeur voulue ?

Pour répondre à cette question j'ai réalisé un benchmark
Résultat (pour ma machine) : une moyenne de 22 ms pour le mysql_num_rows contre 15ms pour COUNT.
(Pour ce test j'ai réalisé 100000 itérations allant de la requête jusqu'a la récupération concrète du nombre de ligne.)


Maintenant ça peut parraitre un peu bêtat de dire que c'est plus rapide en utilisant les fonction de mysql, mais à l'origine cette question ne m'a pas parru évidente.

Je pense donc que ceci est généralisable à la plus part des cas : préférer la solution MySQL lorsque vous avez le choix entre une solution MySQL et PHP.


J'en profite pour poser une petite question : vaut-il mieux stoquer dans une bdd les dates sous formes d'unix timestamp (dans un champ de type INT) ou un des formats de date de mysql ?
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.
Celelibi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2005, 01h10   #145
genova
Membre chevronné
 
Avatar de genova
 
Inscription : septembre 2004
Messages : 487
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 487
Points : 602
Points : 602
Envoyer un message via MSN à genova
Benchmark est ton ami dans ce cas
__________________
Testez le forum Fire Soft Board, un forum libre, gratuit et français.

Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.
genova est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2005, 01h37   #146
Kioob
Membre chevronné
 
Avatar de Kioob
 
Olivier Bonvalet
Inscription : septembre 2004
Messages : 550
Détails du profil
Informations personnelles :
Nom : Olivier Bonvalet
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : septembre 2004
Messages : 550
Points : 723
Points : 723
Envoyer un message via MSN à Kioob
Citation:
Envoyé par Celelibi
J'en profite pour poser une petite question : vaut-il mieux stoquer dans une bdd les dates sous formes d'unix timestamp (dans un champ de type INT) ou un des formats de date de mysql ?
Si tu utilises le format DATE de MySQL, tu pourras faire un grand nombre de calcul directement via MySQL. Et si besoin, tu pourras quand même récupèrer le timestamp UNIX, via la fonction MySQL dédiée à cela.

Par contre si tu stockes en timestamp, tu vas être fortement limité question calculs, et un grand nombre de taches risque d'etre relégué à PHP.
Kioob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2005, 21h48   #147
winzou
Inscrit
 
Inscription : décembre 2004
Messages : 320
Détails du profil
Informations personnelles :
Âge : 24
Localisation : Singapour

Informations forums :
Inscription : décembre 2004
Messages : 320
Points : 444
Points : 444
DATETIME plutot non ?
Sinon tu perd les infos heures/minutes/secondes

La doc mysql est ton amie aussi, très intéressante je trouve :
http://dev.mysql.com/doc/mysql/en/da...functions.html

Existe même en francais :]
http://dev.mysql.com/doc/mysql/fr/da...functions.html
winzou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2005, 02h03   #148
Blustuff
Membre chevronné
 
Inscription : juillet 2002
Messages : 842
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 842
Points : 647
Points : 647
Bonsoir,

Si je veux accèder à n données, uniques, mais accèdées à chaque execution d'un script, vaut il mieux créer une table mysql rien que pour stocker ces n données, ou utiliser un fichier à la place ?

Code :
1
2
3
4
5
6
7
8
9
$Variables = file('variables');
...
$v_i = $Variables[i];
...
$Variables[m] = $v_m;
...
$Fichier = fopen('variables','a');
fwrite ($Fichier, join("\n", $Variables));
fclose($Fichier);
Ou un genre de schéma similaire ?
Blustuff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2005, 13h33   #149
genova
Membre chevronné
 
Avatar de genova
 
Inscription : septembre 2004
Messages : 487
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 487
Points : 602
Points : 602
Envoyer un message via MSN à genova
Si tu utilises énormément de SELECT de ton fichier (c'est à dire de lecture) et que tu utilises relativement peut d'écriture (UPDATE, INSERT) je te conseil de passer par un fichier, mais stoque ces fichiers sous forme de tableau PHP avec var_export().

Par exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$ary = array(
   0 => array(
      'champ1' => 'valeur1',
      'champ2' => 'valeur2'
   ),
   1 => array(
      'champ1' => 'valeur1',
      'champ2' => 'valeur2'
   ),
   2 => array(
      'champ1' => 'valeur1',
      'champ2' => 'valeur2'
   ),
);
?>
Un simple include() et hop le tour est joué.



A part ça j'ai effectué un benchmark qui m'a largement surpris. J'ai fait une fonction de test qui recoit de trois facon un tableau de 1000 éléments. Il recoit ce tableau en paramètre lors du premier test, lors du second test en global, lors du troisième par référence.

Je fais une itération de 10000 tour avec appel de fonction, le résultat est sans appel :
passage du tableau en argument : 5.0572290420532 secondes
passage par globalisation : 0.026066064834595 secondes
Passage par référence : 0.024504899978638 secondes


Voici le code utilisé pour le passage en argument :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
include('function.php');
include('class_benchmark.php');
$ary = array();
for ($i = 0; $i < 1000; $i++)
{
   $ary[$i] = $i * $i;
}
function test($ary)
{
   $ary[0]++;
}
$bench = new bench();
for ($i = 0; $i < 10000; $i++)
{
   test($ary);
}
$bench->finish();
?>
J'en conclu qu'il faut fortement éviter de passer des grosses données par argument à sa fonction (ce qui parait logiquie car toute la mémoirre alouée pour cet élément est passée à la fonction).
__________________
Testez le forum Fire Soft Board, un forum libre, gratuit et français.

Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.
genova est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2005, 14h37   #150
Blustuff
Membre chevronné
 
Inscription : juillet 2002
Messages : 842
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 842
Points : 647
Points : 647
J'ai du mal m'exprimer. Je voulais dire n variables :

Variable 1
Variable 2
...
Variable n

qu'on peut coder en mysql comme une table avec deux champs "Nom Variable" et "Valeur" (ou en une seule ligne ^^ mais c'est pas beau)
Blustuff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2005, 12h56   #151
menkajunan
Invité régulier
 
Inscription : janvier 2004
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 5
Points : 6
Points : 6
Citation:
Envoyé par dark_genova
Je fais une itération de 10000 tour avec appel de fonction, le résultat est sans appel :
passage du tableau en argument : 5.0572290420532 secondes
passage par globalisation : 0.026066064834595 secondes
Passage par référence : 0.024504899978638 secondes
effectivement, c assez impressionant ..
menkajunan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2005, 12h01   #152
titoon
Membre régulier
 
Avatar de titoon
 
Inscription : janvier 2005
Messages : 71
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : janvier 2005
Messages : 71
Points : 90
Points : 90
Citation:
Envoyé par dark_genova
J'en conclu qu'il faut fortement éviter de passer des grosses données par argument à sa fonction (ce qui parait logiquie car toute la mémoirre alouée pour cet élément est passée à la fonction).
??
C'est surtout parce que dans une fonction, PHP travaille sur des copies des variables passées en paramètre (donc si tu passes un bon gros tableau en paramètre, PHP va devoir le copier)
titoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2005, 15h43   #153
ALkyD
Nouveau Membre du Club
 
Inscription : mars 2003
Messages : 31
Détails du profil
Informations personnelles :
Localisation : France, Haute Vienne (Limousin)

Informations forums :
Inscription : mars 2003
Messages : 31
Points : 25
Points : 25
Salut,

j'ai une question qui me turlupine :

Dois-je systématiquement activer la compression GZip ? Je voudrais savoir si elle correspond à un type de sites particuliers, ou bien si elle est efficace dans tous les cas ?

Je suis en train de faire un projet à la SPIP, et je me demande simplement si je dois faire une constante GZIP pour activer ou non la compression HTTP...

Merci de votre aide.
ALkyD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2005, 15h02   #154
131
Invité de passage
 
Inscription : mai 2005
Messages : 1
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 1
Points : 1
Points : 1
Pourquoi alors ne pas travailler qu'avec des référence ?
Est-ce un reflexe à prendre ?
131 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2005, 10h25   #155
jcachico
Membre régulier
 
Homme Joseph Cachico
Chef de projet en SSII
Inscription : mai 2005
Messages : 111
Détails du profil
Informations personnelles :
Nom : Homme Joseph Cachico
Localisation : France

Informations professionnelles :
Activité : Chef de projet en SSII

Informations forums :
Inscription : mai 2005
Messages : 111
Points : 78
Points : 78
Citation:
Envoyé par iubito
Citation:
Envoyé par _Gabriel_
salut,

- les calculs répétés dans les boucles du style

Code :
for($i=0;$i<sizeof($arr);$i++)
ca c'est pas bon!!!
peux-tu préciser un peu, je capte pas là...
A chaque tour dans la boucle tu calcule le alors en le sortant avant la boucle tu le calcule une fois pour toutes.
Au bout de la boucle tu aurra economisé du temps...
jcachico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2005, 09h47   #156
titoon
Membre régulier
 
Avatar de titoon
 
Inscription : janvier 2005
Messages : 71
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : janvier 2005
Messages : 71
Points : 90
Points : 90
Citation:
Envoyé par jcachico
Citation:
Envoyé par iubito
Citation:
Envoyé par _Gabriel_
salut,

- les calculs répétés dans les boucles du style

Code :
for($i=0;$i<sizeof($arr);$i++)
ca c'est pas bon!!!
peux-tu préciser un peu, je capte pas là...
A chaque tour dans la boucle tu calcule le alors en le sortant avant la boucle tu le calcule une fois pour toutes.
Au bout de la boucle tu aurra economisé du temps...
Pour info, il existe en PHP une boucle tout spécialement prévue pour parcourir les tableaux... cf foreach
Et quelques notes en plus sur les différentes boucles
titoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2005, 13h58   #157
praentitong
Futur Membre du Club
 
Développeur Web
Inscription : avril 2005
Messages : 17
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 17
Points : 19
Points : 19
oui mais il arrive qu'on ne veuille pas les deux premières cases du tableau...dans ce cas un for est bien pratique.
praentitong est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2005, 23h02   #158
Blustuff
Membre chevronné
 
Inscription : juillet 2002
Messages : 842
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 842
Points : 647
Points : 647
Si j'ai deux tables A et B, et je veux selectionner des enregistrements de A, et quelques enregistrement de B associés. Du style

Code :
SELECT ... FROM A LEFT OUTER JOIN B ON A.Id = B.Id AND A.Cle = 'Constante'
Vaut il mieux faire réelement la jointure externe, ou vaut il mieux tout rappattrier par une jointure interne, et trier après ce que je garde ou non dans chaque enregistrement ?

Code :
SELECT ... FROM A  JOIN B ON A.Id = B.Id
Code :
1
2
3
4
5
6
$Enregistrement = mysql_fetch_array();
 
if ($Enregistrement[Cle] == 'Constante')
  ...
else
  ...
Blustuff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2005, 04h58   #159
Squallynou
Candidat au titre de Membre du Club
 
Homme Dylann Cordel
Développeur Web
Inscription : juillet 2005
Messages : 12
Détails du profil
Informations personnelles :
Nom : Homme Dylann Cordel
Âge : 27
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : juillet 2005
Messages : 12
Points : 11
Points : 11
Envoyer un message via MSN à Squallynou
Bonjour,


Interessant ce sujet. Je l'ai trouvé en cherchant justement quel était le plus rapide entre un while et un foreach.

J'ai beaucoup vu que vous parliez de libérer la mémoire du server, mais celà se fait au détriment du CPU non ?

Donc faut il vraiment détruire les variables temporaires à chaque fois, et libérer les résult Mysql, ce qui libère de la mémoire mais utilise le CPU à chaque appel de fonction ?

J'apporte ma pierre à l'édifice. Enfin... Disons mon petit caillou plutôt, mais c'est l'intention qui compte ^^ :

Lorsque vous devez compter un nombre d'enregistrement d'une table compotant un champ 'id', et que cette table ne subit jamais d'effacement (table contenant chaque connection au site par exemple, pour faire un compteur avec stats sur le pays etc.) plutôt que de faire un Where 1 et compter le nombre de lignes retournées, faites un Where 1 order by id desc limit 0,1

L'id retourné est le dernier et correspond au nombre d'enregistrement puisque dans ce genre de table aucun n'est supprimé. Donc un seul enregistrement retourné au lieu de tous.
Squallynou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2005, 18h12   #160
Blustuff
Membre chevronné
 
Inscription : juillet 2002
Messages : 842
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 842
Points : 647
Points : 647
Il est très difficile de faire les bons tests de rapidités. Beaucoup de tests sur internet montrent que pour charger le contenu d'un fichier la fonction file_get_content est la plus rapide. En pratique, fgets peut être de 20 % plus rapide à infiniement plus long suivant les paramètres. 20 % sur le chargement d'un gros fichier, ce n'est pas rien.

Il y a toujours un tas de paramètres que l'on oublie, et l'optimisation n'est pas simple. Le pire est qu'elle dépend avant tout de la machine sur laquelle le script tourne. D'une machine à l'autre, d'une configuration à l'autre, les meilleures solutions ne seront pas toujours les mêmes.
Blustuff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h46.


 
 
 
 
Partenaires

Hébergement Web