Denis Beauregard
2017-01-10 17:14:04 UTC
Bonjour,
J'ai développé des logiciels qui fonctionnent par itération.
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écouvert plus tard qu'on pouvait prolonger ce
30 secondes mais j'avais déjà développé presque tout mon code...
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. Donc,
- un $query = 'SELECT MAX(id) FROM base'; pour trouver la dernière
ligne traitée quand le 30 secondes a été atteint
- 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.
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]);
}
}
}
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.
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 ?
Y a-t-il un problème connu d'incompatibilité entre PHP et LibreOffice
ou d'autres logiciels ?
Y a-t-il une façon de vider toutes les variables ou presque à
chaque itération, autrement qu'avec des unset pour chacune ?
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).
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.
Toute idée de solution sera appréciée.
Denis
J'ai développé des logiciels qui fonctionnent par itération.
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écouvert plus tard qu'on pouvait prolonger ce
30 secondes mais j'avais déjà développé presque tout mon code...
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. Donc,
- un $query = 'SELECT MAX(id) FROM base'; pour trouver la dernière
ligne traitée quand le 30 secondes a été atteint
- 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.
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]);
}
}
}
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.
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 ?
Y a-t-il un problème connu d'incompatibilité entre PHP et LibreOffice
ou d'autres logiciels ?
Y a-t-il une façon de vider toutes les variables ou presque à
chaque itération, autrement qu'avec des unset pour chacune ?
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).
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.
Toute idée de solution sera appréciée.
Denis