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

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

Marsh Posté le 15-07-2009 à 10:24:07    

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?

Reply

Marsh Posté le 15-07-2009 à 10:24:07   

Reply

Marsh Posté le 15-07-2009 à 10:30:12    

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.

Reply

Marsh Posté le 15-07-2009 à 10:42:54    

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

Reply

Marsh Posté le 15-07-2009 à 15:08:09    

ç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
Reply

Marsh Posté le 15-07-2009 à 15:24:58    

+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.)

Reply

Marsh Posté le 15-07-2009 à 15:29:37    

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
Reply

Marsh Posté le 15-07-2009 à 16:33:54    


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.

Reply

Marsh Posté le 15-07-2009 à 16:36:23    

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

Reply

Marsh Posté le 15-07-2009 à 16:37:42    

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
Reply

Marsh Posté le 15-07-2009 à 23:53:55    

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

Reply

Marsh Posté le 15-07-2009 à 23:53:55   

Reply

Marsh Posté le 16-07-2009 à 20:51:05    

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?  
Reply

Marsh Posté le 16-07-2009 à 21:36:19    

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
Reply

Marsh Posté le 16-07-2009 à 21:50:21    

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
Reply

Marsh Posté le 16-07-2009 à 22:31:25    

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

Reply

Marsh Posté le 16-07-2009 à 22:45:41    

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 ?

Reply

Marsh Posté le 16-07-2009 à 22:53:33    

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
Reply

Marsh Posté le 16-07-2009 à 23:52:25    

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
Reply

Marsh Posté le 17-07-2009 à 08:12:59    

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
Reply

Marsh Posté le 17-07-2009 à 09:58:50    

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

Reply

Marsh Posté le 17-07-2009 à 10:11:03    

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
Reply

Marsh Posté le 17-07-2009 à 10:29:40    

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 ?

Reply

Marsh Posté le 17-07-2009 à 10:33:31    

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
Reply

Marsh Posté le 18-07-2009 à 09:32:55    


 
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
Reply

Marsh Posté le 18-07-2009 à 10:36:31    

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

Reply

Marsh Posté le 18-07-2009 à 10:50:25    

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
Reply

Marsh Posté le 18-07-2009 à 12:26:53    

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
Reply

Marsh Posté le 18-07-2009 à 15:56:55    

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

Reply

Marsh Posté le 18-07-2009 à 16:19:31    

ç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.

Reply

Marsh Posté le 18-07-2009 à 17:30:13    

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...
Reply

Marsh Posté le 18-07-2009 à 17:48:59    

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

Reply

Marsh Posté le 18-07-2009 à 18:02:58    

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
Reply

Marsh Posté le 18-07-2009 à 18:09:55    

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
Reply

Marsh Posté le 18-07-2009 à 18:12:05    

possible...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 18-07-2009 à 18:16:12    

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
Reply

Marsh Posté le 18-07-2009 à 18:24:03    

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
Reply

Marsh Posté le 18-07-2009 à 18:55:54    

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.

Reply

Marsh Posté le 18-07-2009 à 20:37:16    


 
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
Reply

Marsh Posté le 18-07-2009 à 20:38:31    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed