Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > fr.comp.lang.php > #2967
| From | Denis Beauregard <denis.b-at-francogene.com.invalid@nospam.com.invalid> |
|---|---|
| Newsgroups | fr.comp.lang.php |
| Subject | Re: Nettoyer les variables |
| Date | 2017-01-17 12:12 -0500 |
| Organization | Les Productions FrancoGene |
| Message-ID | <ihjs7c95qn2o7qv28a3tos8s5cc1d55gjh@4ax.com> (permalink) |
| References | <je4a7cl91kvugmlg35h8go8oa5vspdoq8g@4ax.com> <o5lh5e$c49$1@cabale.usenet-fr.net> |
Le Tue, 17 Jan 2017 17:35:58 +0100, Olivier Miakinen
<om+news@miakinen.net> écrivait dans fr.comp.lang.php:
>Bonjour,
>
>Le 10/01/2017 18:14, Denis Beauregard a écrit :
>>
>> J'ai développé des logiciels qui fonctionnent par itération.
>
>Ok.
>
>> En gros, j'ai une entête comme la suivante :
>>
>> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
>> <html><head>
>> <meta http-equiv="refresh" content="1;url=suite.php">
>> </head>
>> <body>
>>
>> et quand le 30 secondes est écoulé, l'itération suivante est
>> lancée.
>
>J'ai déjà une question : comment ton programme suite.php sait-il
>où en était l'itération précédente ? En particulier, si plusieurs
>utilisateurs accèdent au site en même temps, comment sait-il
>s'il traite la suite de la requête faite par l'utilisateur 1 ou
>par l'utilisateur 2 ?
L'utilisation est privée. Je compile des données chez moi et
je suis le seul à utiliser ces applications en local.
>> J'ai découvert plus tard qu'on pouvait prolonger ce
>> 30 secondes mais j'avais déjà développé presque tout mon code...
>
>Qu'est-ce que ça change ? Pendant les 30 secondes séparant deux
>appels HTTP, il n'y a pas de programme PHP qui tourne. Ce qui
>pourrait avoir une influence, ce serait un programme JavaScript
>lancé par la page affichée, mais tu n'en parles pas.
Pas d'autre programme en parallèle. Par contre, l'ordinateur en
soi est utilisé pour autre chose. Ainsi, il y a un navigateur
(Seamonkey et Chrome en fait), et souvent Libreoffice.
>> Mon code comprend une boucle et à chaque tour, on examine une
>> ligne dans une grosse base de données (200 000 ou 700 000 lignes
>> selon la base). Cet examen comprend toujours la lecture d'une
>> nouvelle ligne de données, mais aussi l'examen d'autres lignes
>> ainsi que l'écriture dans d'autres bases de données.
>
>Je ne comprends pas ce que tu appelles « un tour ». C'est un tour
>de boucle en PHP (donc il peut y en avoir 700 000 par appel HTTP)
>ou bien c'est une itération (« HTTP refresh » -- et donc il y en a
>un seul par appel du programme PHP) ?
Une boucle pour chaque ligne, donc 700 000 boucles et chacune
comprend plusieurs appels à la base de données (query pour des
tables différentes).
>> Donc,
>>
>> - un $query = 'SELECT MAX(id) FROM base'; pour trouver la dernière
>> ligne traitée quand le 30 secondes a été atteint
>
>Tu veux dire une fois par appel, donc ?
oui
>> - au moins un 'SELECT * FROM base1 WHERE id = '.$eux;
>> - plusieurs SELECT et INSERT
>>
>> et ceci pour quelques millieurs d'itérations à chaque fois
>>
>> Il s'en suit un certain recyclage des variables mais j'ai
>> l'impression que ce recyclage est très imparfait et que la
>> mémoire disponible diminue à chaque boucle. Toutefois, aucun
>> moyen d'afficher le heap et le stack. J'ai fait des essais
>> avec memory_get_peak_usage et memory_get_usage et j'ai toujours
>> plus de 700 000 à ma disposition.
>
>Tu veux dire que chacun des scripts appelés semble disposer du
>même espace mémoire, mais que la mémoire globale utilisée sur
>l'ordinateur diminue ? Il faudrait voir s'il n'y a pas trop de
>requêtes lancées simultanément suite aux refreshs... même si,
>en principe, chaque nouvelle requête ne devrait démarrer que
>30 secondes après la fin de la requête précédente.
Un seul script à la fois (ou deux car je peux lancer 2 scripts
différents).
>> J'ai par ailleurs noté que si on fait un unset d'un array,
>> le contenu n'est pas vidé. J'ai fait un utilitaire pour le
>> faire :
>>
>> function ViderArr ($arr) {
>> if (isset ($arr)) {
>> if (isset ($arr[$key])) unset($arr[$key]);
>> }
>> }
>> }
>
>C'est curieux, ce que tu dis. Comment constates-tu cela ?
En regardant l'espace disponible selon que j'utilise ou pas
cette fonction.
>> Ceci dit, j'ai l'impression d'avoir un débordement de mémoire que
>> je n'arrive pas à trouver. Le genre de bug intermittent qu'on
>> déteste avoir parce qu'il est trop difficile à détecter.
>
>Oui.
>
>> Y a-t-il moyen de vérifier rapidement si une variable déborde
>> autrement qu'en vérifiant pour chacune ?
>>
>> Y a-t-il un moyen d'afficher le heap et le stack pour s'assurer
>> qu'il n'y a pas de collision ?
>
>Je ne sais pas répondre à ces questions. Je ne suis d'ailleurs
>pas sûr de les comprendre.
>
>> Y a-t-il un problème connu d'incompatibilité entre PHP et LibreOffice
>> ou d'autres logiciels ?
>
>Alors là, je ne vois pas comment ce serait possible. Les logiciels
>en question, ils tourneraient sur ton serveur web, ou bien sur la
>machine cliente ?
Sur ma machine.
>> Y a-t-il une façon de vider toutes les variables ou presque à
>> chaque itération, autrement qu'avec des unset pour chacune ?
>
>Même question que supra pour les « tours » : de quelle itération
>parles-tu ? S'il s'agit de requêtes HTTP différentes, les variables
>doivent repartir à chaque fois dans l'état « non initialisé »,
>il n'y a donc rien à vider. Ou alors c'est un vrai bug du moteur
>PHP.
Durant les 30 secondes d'un cycle, je peux boucler 5000 fois. Je
voudais vider toutes les variables 5000 fois (ou quand j'avance
d'une ligne dans le traitement de ma base de données).
>> Mon principal symptôme : l'ordinateur arrête parfois pendant que mon
>> script PHP est exécuté (j'ai maintenant 4 scripts qui donnent ce
>> résultat).
>
>Est-ce que tu peux avoir des statistiques sur le nombre de requêtes
>HTTP par minute, et sur la durée moyenne de traitement d'une requête ?
>Si tu as régulièrement une requête lancée toutes les 30 secondes
>mais que chacune d'entre elles dure 40 secondes, alors il est normal
>qu'au bout d'un moment ça sature.
Je peux faire 15000 boucles dans une minutes et chaque boucle peut
disons faire 5 query en SQL. Donc je peux faire 75 000 appels à SQL
(le plus souvent des SELECT, parfois des INSERT) durant une minute.
>> Ma config :
>>
>> Windows 7
>> Testé avec EasyPHP, puis Wampserver 2.5 et 3.06, donc des Apache,
>> PHP et mySQL différents
>> 4 Go de mémoire
>>
>> J'ai aussi varié quelques paramètres de php.ini
>> Je viens de faire un test intensif de mémoire (avec l'utilitaire
>> de Windows 7) et aucune erreur de ce côté.
>> PHP ne détecte aucune erreur. Le log montre seulement la fin des
>> blocs de 30 secondes et rien de plus.
>
>Les 30 secondes, elles sont comptées sur la machine cliente, pas sur
>le serveur. Alors quels sont ces « blocs de 30 secondes » dont le
>log montrerait une fin ? Tu veux dire juste la réception d'une
>nouvelle requête ?
Il y a une seule machine. C'est sur mon ordinateur personnel que tout
cela fonctionne, pas via Internet.
Denis
Back to fr.comp.lang.php | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Nettoyer les variables Denis Beauregard <denis.b-at-francogene.com.invalid@nospam.com.invalid> - 2017-01-10 12:14 -0500
Re: Nettoyer les variables Olivier Miakinen <om+news@miakinen.net> - 2017-01-17 17:35 +0100
Re: Nettoyer les variables Denis Beauregard <denis.b-at-francogene.com.invalid@nospam.com.invalid> - 2017-01-17 12:12 -0500
Re: Nettoyer les variables Olivier Miakinen <om+news@miakinen.net> - 2017-01-17 18:54 +0100
Re: Nettoyer les variables Denis Beauregard <denis.b-at-francogene.com.invalid@nospam.com.invalid> - 2017-01-17 14:13 -0500
Re: Nettoyer les variables Olivier Miakinen <om+news@miakinen.net> - 2017-01-20 09:31 +0100
Re: Nettoyer les variables Denis Beauregard <denis.b-at-francogene.com.invalid@nospam.com.invalid> - 2017-01-20 11:32 -0500
Re: Nettoyer les variables Fredchou <fredchou@nospam.free.fr.invalid> - 2017-01-29 18:34 +0100
Re: Nettoyer les variables Denis Beauregard <denis.b-at-francogene.com.invalid@nospam.com.invalid> - 2017-01-30 16:56 -0500
csiph-web