[Résolu] Regex, CURL et Ressources

Vous avez un soucis de développement et ce n'est pas du ressort de notre support ? N'hésitez pas à soumettre vos petits soucis de développement et à vous entre aider par la même occasion.
Inconnu
Cet utilisateur a supprimé son compte et n’existe plus.
Messages : 6340
Inscription : 29 décembre 2010 à 18:15

Bien le bonjour, populace de FS :)

Je tiens à rappeler à quel point je suis ravi de voir que le trafic web est passé en illimité. Avoir de belles images qui servent de temps à autres aide toujours à la beauté d'un site. Ce coup de pouce est d'autant plus apprécié que mon "site" doit accéder à beaucoup d'informations.


Cette parenthèse faite, j'en viens au cœur du sujet.

J'ai un script dont l'objectif est la récupération et le traitement de données externes. Cela repose sur des preg_match_all et du curl. Afin d'alléger la charge, j'ai séparé chaque grosse étape à l'aide d'une variable de session indiquant l'étape et des réactualisations automatiques. On répartit les efforts et surtout, on réduit le temps d'exécution. Ceci est d'autant plus justifié que les regex sont gourmandes. Sacrées bestioles mais qui me sauvent bien des fois :)

Par habitude, je teste toujours mes scripts en local avant de les exporter sur FranceServ. La configuration du php.ini en local est au mieux égale à celle du php.ini de FranceServ en matière de mémoire allouée et de mémoire tampon.

Mon script fonctionne parfaitement en local mais il bloque à une étape s'il est lancé à partir du site hébergé ici.

J'ai pris le soin de relever la mémoire utilisée car je pense qu'il s'agit ici du nœud du problème.
Local: le pic d'utilisation (donné par memory_get_peak_usage) 1048576 soit un poil plus qu'1 Mb
Hébergé: 786432 soit presque 790 Kb.

Bien en dessous des 256M prêtés par FranceServ donc. Ce n'est donc pas cela.

Mais qu'est-ce qui cloche bon sang ?
Cela viendrait-il peut-être de la version de php utilisée sur FS ?
La taille du output buffer ?

PS: j'ai essayé des unset pour virer les variables inutiles toujours dans l'espoir d'alléger l'exécution. Sans succès.
PS2: j'ai également un peu forcé la main de php avec un test de ini_set("memory_limit" , "24M") en début de code afin de m'assurer de la bonne disposition de mémoire. Sans succès.
Avatar de l’utilisateur
Elodie
Fondatrice / Responsable
Fondatrice / Responsable
Messages : 7938
Inscription : 2 avril 2010 à 20:14

Bonjour,

Est-ce qu'en activant l'affichage des éventuels messages d'alertes et d'erreurs PHP (via le gestionnaire de votre site dans votre interface de gestion) et en exécutant ce script depuis un simple navigateur, quelque chose apparait ?
Vous avez une question ? Posez-la de préférence sur le forum et si ça demande un contact plus instantané, n'hésitez pas à vous rendre sur le t'chat IRC. Si votre question est personnelle, contactez-nous directement.
Inconnu
Cet utilisateur a supprimé son compte et n’existe plus.
Messages : 6340
Inscription : 29 décembre 2010 à 18:15

Il n'y a malgré rien à y redire: j'adore votre rapidité à répondre. C'est très rassurant et très positif.

Alors pour répondre, non, je n'ai aucun message d'erreur.

En fait, l'erreur se produit lors de la récupération du code source d'une page externe. Pour cela,n j'utilise une fonction qui fonctionne très bien pour les autres appels à celle-ci.

En vérifiant, il apparait que le script bloque sur la récupération dudit code source. En fait, il reçoit les premiers caractères puis, le transfert se met en pause sans toutefois terminer immédiatement l'exécution du script. C'est pour cela que je pensais à un débordement de mémoire.

Le script poursuit son exécution après un court délai et les variables qui devaient normalement être tirée suite au traitement du code source ainsi récupéré , sont vides. Normal: le code source sur lequel travaille la regex (et qui détermine les variables sous jacentes) semble poser problème.

Je peux vous transmettre le code source de ladite fonction si cela peut servir.

Sinon, le journal d'erreur ne relève aucune anomalie.
Inconnu
Cet utilisateur a supprimé son compte et n’existe plus.
Messages : 6340
Inscription : 29 décembre 2010 à 18:15

Je regarde le journal d'erreur du serveur local. Ne sait-on jamais qu'il apporterait un brin de solution.
Avatar de l’utilisateur
Elodie
Fondatrice / Responsable
Fondatrice / Responsable
Messages : 7938
Inscription : 2 avril 2010 à 20:14

werner a écrit :En vérifiant, il apparait que le script bloque sur la récupération dudit code source. En fait, il reçoit les premiers caractères puis, le transfert se met en pause sans toutefois terminer immédiatement l'exécution du script. C'est pour cela que je pensais à un débordement de mémoire.
C'est fort possible, je me souviens d'avoir eu une discussion sur le même sujet dans le forum (mais où ...) où en mettant un fichier XML moins volumineux tout fonctionné parfaitement.

Je ne me souviens pas avoir résolu ce problème mais la personne avait pu scinder son fichier XML en plusieurs parties pour que tout puisse passer à la fin.

Je n'ai pas connaissance des limitations de buffer (j'utilise alors celles par défaut ou les valeurs maximales).

Il faudrait alors essayer (si possible) de tester si une ressource extérieur moins volumineuse passe et arriver à déterminer à partir de combien ça ne passe plus pour localiser la valeur à adapter.
werner a écrit :Je peux vous transmettre le code source de ladite fonction si cela peut servir.
Oui je veux bien :)
Vous avez une question ? Posez-la de préférence sur le forum et si ça demande un contact plus instantané, n'hésitez pas à vous rendre sur le t'chat IRC. Si votre question est personnelle, contactez-nous directement.
Inconnu
Cet utilisateur a supprimé son compte et n’existe plus.
Messages : 6340
Inscription : 29 décembre 2010 à 18:15

Alors:
1) je ne vois vraiment pas comment scinder le fichier XML. Déjà, je l'obtiens via une requête GET (moins de mémoire allouée qu'une requête POST). Mais là, il plante avant même de pouvoir obtenir l'ensemble du code. Il s'arrête même presque au début du code source, ce qui m'étonne. Vous auriez une idée pour extraire tout cela sans bouffer la mémoire ?
2) le journal d'erreur en local ne relève rien du tout.
3) je vous envoie le code source via le formulaire de contact.
Avatar de l’utilisateur
Elodie
Fondatrice / Responsable
Fondatrice / Responsable
Messages : 7938
Inscription : 2 avril 2010 à 20:14

En regardant les journaux du proxy sortant, je vois que vous faites des POST toutes les 2 secondes entres "caserne", "colonies", "port" et "changeur" etc ..., c'est voulu ?
Vous avez une question ? Posez-la de préférence sur le forum et si ça demande un contact plus instantané, n'hésitez pas à vous rendre sur le t'chat IRC. Si votre question est personnelle, contactez-nous directement.
Inconnu
Cet utilisateur a supprimé son compte et n’existe plus.
Messages : 6340
Inscription : 29 décembre 2010 à 18:15

Oui car il récupère des informations contenues sur la page web distante "caserne", "port", colonie" (c'est elle qui plante), ... et "changeur" qui permet effectivement de pouvoir passer d'une caserne à une autre.

En fait:
- POST
- GET
- preg_match_all
Puis, un http-equiv="Refresh" permet de passer à une situation suivante avec une nouvelle requête POST, GET, preg match all, .... et ainsi de suite.

Je suis conscient que c'est assez lourd comme code au niveau du besoin en ressources performances. Rallonger le délai imposé par http-equiv="Refresh" entre chaque réactualisation ne semble pas significativement changer quelque chose.



PS/ code source envoyé.
Avatar de l’utilisateur
Elodie
Fondatrice / Responsable
Fondatrice / Responsable
Messages : 7938
Inscription : 2 avril 2010 à 20:14

werner a écrit :Alors pour répondre, non, je n'ai aucun message d'erreur.
Vous avez bien attendu les 5 minutes pour que l'affichage puisse se faire ? Actuellement l'affichage est désactivé pour votre site.

Je ne suis pas développeuse alors ça vas être difficile pour moi de vous corriger ou optimiser votre code.

La seule solution que je vois actuellement, c'est de procéder à des print de résultat avec des pauses pour localiser le problème :/
Vous avez une question ? Posez-la de préférence sur le forum et si ça demande un contact plus instantané, n'hésitez pas à vous rendre sur le t'chat IRC. Si votre question est personnelle, contactez-nous directement.
Inconnu
Cet utilisateur a supprimé son compte et n’existe plus.
Messages : 6340
Inscription : 29 décembre 2010 à 18:15

OW, je n'ai pas attendu 5 min :|

Je fait cela dès maintenant.

Pour corriger ou optimiser le code, je pense que on ne peut rien faire à ce niveau-à: le script se limite à peu de chose et le peu de chose est déjà indispensable et déjà tourné pour ne pas gaspiller les ressources. Mais tout espoir n'est pas perdu :)

Sur ce, je laisse tourner le superviseur de journaux. Je verrai bien ce qu'il me raconte. Et s'il dit rien, j'irai me pencher sur une solution visant à réduire la charge serveur. Je vous tiens au courant si besoin est.

Merci encore, c'est vraiment sympa :)
Répondre