Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
849 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Un script de 30000 lignes peut-il avoir un impact sur les performances

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Un script de 30000 lignes peut-il avoir un impact sur les performances

n°1905210
Profil sup​primé
Posté le 15-07-2009 à 10:24:07  answer
 

On m'a demandé de jetter un oeil sur un site web particulièrement lent.
En trifouillant je me rend compte que toute une partie du site se trouve dans deux scripts :
logique de 15000 lignes
tempalte de 12000 lignes
Bon c'est assez "bien fait" dans le sens où tout est décomposé en fonctions et un gros switch pour les appeler.
Je me demande si passer toujours par ces 30.000 lignes avait réellement un impact sur les perfs  
ou alors est-ce que ça reste acceptable?

mood
Publicité
Posté le 15-07-2009 à 10:24:07  profilanswer
 

n°1905211
antac
..
Posté le 15-07-2009 à 10:30:12  profilanswer
 

Un switch n'est pas forcément une bonne idée, j'utiliserai plutot un eval sur le paramètre passé pour lancer la fonction correspondante.

n°1905215
Profil sup​primé
Posté le 15-07-2009 à 10:42:54  answer
 

oui oui on est bien d'accord. Ma question concerne surtout les 30.000 lignes sur l'impact sur les perfs.

n°1905383
NewsletTux
<Insérez ici votre vie />
Posté le 15-07-2009 à 15:08:09  profilanswer
 

ça dépend ce qu'il y a à traiter ... Si c'est 30 mille lignes d'un "echo" non ça ne sera pas forcément optimisable ... Si par contre c'est un echo avec des variables foutues n'importe comment dans le teste (genre echo "bonjour $prenom" ) + des calculs + des opérations de texte/expressions + des requêtes SQL + ouvertures/fermetures de fichiers, le tout réitéré 1500 fois par jour, effectivement ça peut avoir un impact.


---------------
NewsletTux - outil de mailing list en PHP MySQL
n°1905394
Profil sup​primé
Posté le 15-07-2009 à 15:24:58  answer
 

+1
si tu veux que l'on t'aide il faudra être un peu plus précis :jap: (exemple de code, que font les scripts, est-ce qu'il y a un cache, etc.)

n°1905399
esox_ch
Posté le 15-07-2009 à 15:29:37  profilanswer
 

Pour changer, moi je dis qu'avant de commencer une chasse aux sorcières pour détecter un éventuel problème de performances, il faudrait éventuellement être sûr qu'il y en ait un.
Donc tu benchmark pour voir si les temps d'accès sont potables, puis tu profiles pour voir qui pompes les ressources et en fin seulement tu optimises.
C'est quoi cette mode de "Je prend mon script et je le tourne dans tous les sens pour voir si ça améliore les perf, en sachant que je n'avais pas de problème de perf notable au départ" qui commence à fleurir sur ce forum :heink:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1905437
Profil sup​primé
Posté le 15-07-2009 à 16:33:54  answer
 


Je voulais juste savoir si il y avait un impact sur les perfs d'avoir un gros fichier plutôt que plusieurs petits fichiers, inutile de me sauter à la gorge.

n°1905442
Taz
bisounours-codeur
Posté le 15-07-2009 à 16:36:23  profilanswer
 

non. a coup d'include, tu peux de toutes façons arriver à cette taille de script.

n°1905443
esox_ch
Posté le 15-07-2009 à 16:37:42  profilanswer
 

Bah à première vue, je pense que c'est pas forcément top de décomposer ton fichier juste pour le fun d'avoir 100 petits fichiers. Parce que à chaque fois apache va devoir s'amuser à les ouvrir/fermer les 100, qui seront en plus pas forcément adjacents sur le HDD...
Mais encore une fois, je pense vraiment que tu dois benchmarker et profiler plutôt que d'y aller à l'aveuglette ... C'est pas pour être méchant, c'est pour éviter que tu passes 100 heures à résoudre un problème que tu n'avais pas [:spamafote]


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1905632
Taz
bisounours-codeur
Posté le 15-07-2009 à 23:53:55  profilanswer
 

premature machin toussa
 
fais du code modulaire et réutilisable et tout ira bien.

mood
Publicité
Posté le 15-07-2009 à 23:53:55  profilanswer
 

n°1905955
jagstang
Pa Capona ಠ_ಠ
Posté le 16-07-2009 à 20:51:05  profilanswer
 

le plus intéressant serait de déterminer quelle portion de code prends le plus temps


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°1905966
esox_ch
Posté le 16-07-2009 à 21:36:19  profilanswer
 

Par exemple en utilisant un profiler :o


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1905970
Alekusu2
Posté le 16-07-2009 à 21:50:21  profilanswer
 

antac a écrit :

Un switch n'est pas forcément une bonne idée, j'utiliserai plutot un eval sur le paramètre passé pour lancer la fonction correspondante.


Je suis un gros noob mais ça m'intéresse. Tu peux expliquer pourquoi il faut mieux utiliser eval et pas switch ? Avec si possible un exemple simple.


Message édité par Alekusu2 le 16-07-2009 à 21:50:44
n°1905981
tomsoft
Posté le 16-07-2009 à 22:31:25  profilanswer
 

paske switch = if / if / if / if (c'est gourmand)
 
eval = un appel de fonction en gros

n°1905986
Alekusu2
Posté le 16-07-2009 à 22:45:41  profilanswer
 

Hummm je vois...
 
Quand je faisais un peu de JS, y avait un soft qui permettait de compiler le JS en supprimant tous les espaces, renommant tout avec des noms courts, etc, etc. Complètement illisible après mais génial pour le poids du fichier et la rapidité d'execution. Il n'y aurait pas quelque chose comme ça en PHP ?

n°1905987
esox_ch
Posté le 16-07-2009 à 22:53:33  profilanswer
 

Si c'est un plugin de Zend (zend optimiser)
Par contre le genre d'optimisation eval VS switch me fait bien rire ... Pour gagner quelques nanoseconde on rend un code bien illisible...


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1906002
antac
..
Posté le 16-07-2009 à 23:52:25  profilanswer
 

Tu trouves que c'est illisibles.
 
pour moi une ligne eval($_POST['Fonction a lancer']+'()') est plus lisible que :
switch $_POST['Fonction a lancer']
 case 'fct1' : fct1(); break;
 case 'fct2' : fct2();break;
 case 'fct3' : fct3();break;
 
Enfin, ce n'est que mon humble avis.
 
De plus ça évite quand tu écrits ta fonction de devoir la redéfinir dans ton switch.
 
Après ça dépend de l'utilisation, eval ici est très bien car les paramètres sont les mêmes (aucun dans ce cas). Je me sert d'eval pour une page qui n'est appelé que suite à un POST où toutes les variables passés sont traités à l'intérieur des fonctions.

Message cité 1 fois
Message édité par antac le 16-07-2009 à 23:58:57
n°1906020
Profil sup​primé
Posté le 17-07-2009 à 08:12:59  answer
 

antac a écrit :

eval($_POST['Fonction a lancer']+'()')

[:mlc2]
En fait dans ton cas switch te permet d'éviter une grosse faille de sécurité parce qu'il joue le rôle d'une liste blanche, après à toi de voir quelle est ta priorité, la sécurité ou quelques nanosecondes de moins ?

Message cité 1 fois
Message édité par Profil supprimé le 17-07-2009 à 08:15:54
n°1906051
Profil sup​primé
Posté le 17-07-2009 à 09:58:50  answer
 

Juste un petit feedback :
les deux fichiers ne sont pas si lent à charger mais l'impact est surtout au niveau de la mémoire consommée : 4Mo

n°1906055
esox_ch
Posté le 17-07-2009 à 10:11:03  profilanswer
 

Oui mais non :o
Tes 4 Mo je suppose que c'est la taille sur le disque dur du fichier en question?
Déjà 4 Mo c'est rien par rapport aux Go de ram qu'a un serveur web un minimum costaud, en plus si t'as bien pensé ton truc, tu vas surement avoir des fonctions de cache qui vont bypasser tout ça.
Si t'en as pas et que t'as pas envie d'en implémenter, reste à voir comment apache (et php) vont gérer les requêtes concourantes (est-ce qu'il va charger en ram le fichier pour chaque connection, ou bien va-t-il le garder en mémoire et l'utiliser pour plusieurs requêtes simultanément).
 
Pour tester tout ça, le plus simple et rapide c'est d'utiliser un utilitaire style ab ( http://www.cyberciti.biz/tips/howt [...] erver.html ) et regarder comment se comporte ta ram avec une charge cohérente avec tes besoins (pas besoin de simuler 1000 requêtes concourantes pour un album de photo de famille). Sinon t'as des outils plus poussés ( http://www.opensourcetesting.org/performance.php ) mais je doute qu'à ton stade t'en ai besoin


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1906076
Profil sup​primé
Posté le 17-07-2009 à 10:29:40  answer
 

esox_ch a écrit :

Oui mais non :o
Tes 4 Mo je suppose que c'est la taille sur le disque dur du fichier en question?


Du tout. C'est la valeur de memory_get_usage()
Tu réponds toujours comme si les gens étaient des cons ou c'est juste avec moi ?

n°1906079
esox_ch
Posté le 17-07-2009 à 10:33:31  profilanswer
 

Non, je suis désolé si je t'ai donné cette impression mais j'ai l'impression que tu chasses un fantôme ...
Essaie de faire un test avec "ab" histoire de voir comment ton serveur se comporte, comment est-ce qu'il pool tes requêtes & co.
 
Ce que j'essaie de te dire depuis un moment c'est que de toutes façons si ton script fait 30'000 lignes, tu n'y peux rien, c'est comme ça. Et comme le dit Taz, c'est pas quelque chose d'impensable un script de 30'000 lignes, quand on considère les "includes".  
Donc après le tout sera de voir :
 - Si dans tes 30'000 lignes il y a des fonctions très gourmandes qui pourraient être optimisées (et là, on utilise un profiler pour le detecter)
 - Si ton serveur est bien configuré et a un hardware correctement dimentionné (et là, c'est les outils genre "ab",jmeter & co qui vont t'aider à le savoir)


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1906296
antac
..
Posté le 18-07-2009 à 09:32:55  profilanswer
 


 
Ca dépend comment tu programmes ce genre de chose et l'utilisation.
 
<mode MyJob>
Exemple concret de mon boulot en AJAX.
Je gère de façon séparé dans une page PHP tout ce qui concerne les accès bases de données (ajout/modif, suppression, lecture).
Ces trois types d'accès sont dans des fonctions distinctes de ma page PHP.  
 
Imagine la page "Gestion clients", la page PHP concernant les accès bases contient une trentaine de ces fonctions et uniquement ces fonctions.
 
Coté client, je fais un appel AJAX sur un store qui va envoyer le paramètre 'task' contenant le nom de la fonction (ainsi que les autres paramètres nécessaires à la fonction) à exécuter, eval en début de fichier va lancer la fonction passé en $_POST['task'].
 
Il n'y a pas plus de risque qu'avec un switch et je trouve ça plus lisible.  
 
</mode>
 
Ma priorité est dans l'ordre :  
- La sécurité
- La lisibilité du code
- Les perfs

Message cité 1 fois
Message édité par antac le 18-07-2009 à 09:33:45
n°1906305
Profil sup​primé
Posté le 18-07-2009 à 10:36:31  answer
 

N'importe qui peut envoyer n'importe quoi par POST et donc n'importe quel nom de fonction hein [:petrus75]

n°1906309
esox_ch
Posté le 18-07-2009 à 10:50:25  profilanswer
 

antac a écrit :


 
....
Coté client, je fais un appel AJAX sur un store qui va envoyer le paramètre 'task' contenant le nom de la fonction (ainsi que les autres paramètres nécessaires à la fonction) à exécuter, eval en début de fichier va lancer la fonction passé en $_POST['task'].
 
Il n'y a pas plus de risque qu'avec un switch et je trouve ça plus lisible.  
 


 
ça c'est toi qui le dit [:prozac]
 
Le seule manière de t'en assurer c'est, comme le dit justement luc@s, de passer par une liste blanche. Donc eval + array des méthodes autorisées ou bien switch


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1906319
antac
..
Posté le 18-07-2009 à 12:26:53  profilanswer
 

Si tu passes par un switch, vu que toutes mes fonctions devront être déclarées dans le switch dans mon cas pour les exécuter.  
 
Que ce soit avec un switch ou un eval, la fonction appelée sera exécutée.
Liste blanche ou pas.
 
Même dans mon Eval, j'ai un système permettant de vérifier qu'on lance bien une fonction et rien d'autre (pour éviter les appels système direct par exemple).
 
Après j'ai d'autres mesures de sécurité à l'intérieur de mes méthodes qui entrent en jeu.


Message édité par antac le 18-07-2009 à 12:31:50
n°1906332
Profil sup​primé
Posté le 18-07-2009 à 15:56:55  answer
 

et çà te gêne pas que tout le monde puisse exécuter n'importe quelle fonction ? [:petrus75]

n°1906334
antac
..
Posté le 18-07-2009 à 16:19:31  profilanswer
 

ça aurait la même chose avec un switch vu que toutes les fonctions devraient être déclarés dedans afin qu'elles puissent être lancés.
 
Et comme j'ai dis, j'ai d'autres sécurités dans mes fonctions.

n°1906338
KangOl
Profil : pointeur
Posté le 18-07-2009 à 17:30:13  profilanswer
 

securité ? j'aimerai savoir comment...
 
avec ton code  

Code :
  1. eval($_POST['task']+'()')


 
et maintenant, si je post ca:

Code :
  1. function pwned() {unlink(__FILE__);};pwned


 
*kaboom*


---------------
Nos estans firs di nosse pitite patreye...
n°1906342
boblenain2​00
Posté le 18-07-2009 à 17:48:59  profilanswer
 

C'est possible de poster çà via l'URL ?

n°1906344
Profil sup​primé
Posté le 18-07-2009 à 18:02:58  answer
 

oui
EDIT (précision) : mais dans ce cas çà ne changera rien puisque c'est $_POST qui est utilisé et pas $_GET ou $_REQUEST


Message édité par Profil supprimé le 18-07-2009 à 18:03:35
n°1906346
esox_ch
Posté le 18-07-2009 à 18:09:55  profilanswer
 

KangOl a écrit :

securité ? j'aimerai savoir comment...
 
avec ton code  

Code :
  1. eval($_POST['task']+'()')


 
et maintenant, si je post ca:

Code :
  1. function pwned() {unlink(__FILE__);};pwned


 
*kaboom*


 
Probablement il utilise une moulinette sur get_defined_functions pour se créer une whitelist à la volée


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1906347
KangOl
Profil : pointeur
Posté le 18-07-2009 à 18:12:05  profilanswer
 

possible...


---------------
Nos estans firs di nosse pitite patreye...
n°1906348
esox_ch
Posté le 18-07-2009 à 18:16:12  profilanswer
 

Bah si c'est le cas, son système marche et peut être intéressant car il doit pas se faire chier à mettre à jour sa Whitelist.
Reste que je vois absolument pas comment il utilise son site :heink:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1906349
antac
..
Posté le 18-07-2009 à 18:24:03  profilanswer
 

En fait je le fais de façon plus simple, je vérifie que les trois premières lettres du POST sont bien 'fct' et qu'il n'y a pas d'autres caractères que de l'alphanumérique.
C'est la vérif initiale.
Ca permet d'éviter justement de faire ce genre de petites injection comme le montre KangOl

 

Certes c'est un peu bourrin mais ça a le mérite de marcher.


Message édité par antac le 18-07-2009 à 18:26:00
n°1906354
Profil sup​primé
Posté le 18-07-2009 à 18:55:54  answer
 

j'espère que tu fais aussi un function_exists, histoire de pas trouver plein d'erreur fatales dans tes logs ;)
Ceci dit je suis quand même sceptique :
Au niveau des performances, s'il faut plusieurs fonctions de test et une regex je ne sais pas si tu gagnes vraiment à utiliser eval().
Au niveau lisiblité aussi : avec un switch on voit les différentes fonctions à lancer directement (tu en as tout au plus une douzaine non ?) tant dis qu'avec eval on ne sait pas quelles fonctions peuvent être lancées.

n°1906371
esox_ch
Posté le 18-07-2009 à 20:37:16  profilanswer
 


 
Pas mieux .. M'enfin bon si tu t'y retrouves antac .. tant mieux ... je prie juste que personne d'autre que toi doive maintenir ce code ..


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1906374
antac
..
Posté le 18-07-2009 à 20:38:31  profilanswer
 

je pourrai faire un function_exists mais comme je l'ai dit la page qui contient ces fonctions est exclusivement appelé via un appel AJAX, il n'y a aucune possibilité que ça foire et que ça appel une fonction bidon vu que cette page ne contient que des fonctions qui doivent être appelés (ce n'est pas un include attention) et si jamais ça foire, le log va justement se remplir et ça permet de tracer les éventuels petits filous.
 
D'autre part, c'est une application utilisé par les 500 personnes de ma société et n'est pas accessible de l'extérieur.
 
Enfin, nous sommes deux développeurs sur cette application, cette approche a été écrite par mon collègue et je n'ai eu aucune difficulté à la comprendre ni à la maintenir.


Message édité par antac le 18-07-2009 à 20:41:23
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Un script de 30000 lignes peut-il avoir un impact sur les performances

 

Sujets relatifs
[VBA] Erreur out of range sur scriptAdressage de matrice, performances
Besoin d 'aide pour combiner 2 script Javascript.[SQL SERVER 2005] Script de remplissage de table (BLUK INSERT & cie)
Script de téléchargement de fichierhelp me, script pour AD boite de dialogue et généré fichier
Script pour Seafightscript de remplacement de fichiers
[BATCH] script de suppression des profils[VBA] Msgbox, combien de lignes maximum ?
Plus de sujets relatifs à : Un script de 30000 lignes peut-il avoir un impact sur les performances


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR