[RESOLU] Utilisation de MYSQLI_USE_RESULT de la data manque

Eléphant du PHP | 385 Messages

08 sept. 2022, 14:33

Hello à tous

Voilà mon problème, j'ai une grosse requête sql sur un legacy qui va être execute pour plusieurs dates (400 000 résultats par date)
Quand j'avais testé, je m'étais rendu compte que la mémoire php n'est pas totalement libéré lors de l'utilisation de mysqli_query et du coup j'avais des erreurs.
J'ai donc trouvé

Code : Tout sélectionner

mysqli_query($db, $query, MYSQLI_USE_RESULT);
Cela a réglé mes soucis mais j'ai l'impression que ça skip de la data surtout en lisant la doc

Code : Tout sélectionner

MYSQLI_USE_RESULT - returns a mysqli_result object with unbuffered result set. As long as there are pending records waiting to be fetched, the connection line will be busy and all subsequent calls will return error Commands out of sync. To avoid the error all records must be fetched from the server or the result set must be discarded by calling mysqli_free_result().
La logique est
- Pour chaque date
- Le code va récupérer les posts pour une date (ça peut être 400 0000 résultats)
- Des threads sont actionnés pour process ces valeurs
- date suivante

Du coup, je ne sais pas comment faire :(
Auriez-vous une idée svp? Comment auriez-vous fait ?

Merci

Avatar du membre
Mammouth du PHP | 1609 Messages

08 sept. 2022, 14:40

Salut, le texte explique juste que tant que le jeu de résultats n'a pas été parcouru en totalité, la connexion est occupée et tous les appels retourneront une erreur "Commands out of sync". Si tu as besoin de faire des appels avant que le jeu de résultat soit entièrement parcouru, il faut appeler mysqli_free_result() pour libérer la connexion, mais dans ce cas je suppose qu'on ne peut plus faire de fetch sur le result set.
Développeur web depuis + de 20 ans

Eléphant du PHP | 385 Messages

08 sept. 2022, 15:55

Merci pour la réponse
Si je comprends bien, comme la requête prends un peu de temps et que j'ai un

Code : Tout sélectionner

while ($dat = mysqli_fetch_object($lst)) {
Ça peut skiper des résultats, car le jeu de résultat n'est pas entièrement parcouru ?

Ce qui est curieux c'est qu'actuellement le

Code : Tout sélectionner

$lst = mysqli_query($db, $query, MYSQLI_USE_RESULT);
Devrait retourner 160 000 lignes
mais quand je boucle dessus et utilise des threads ou ça prend un peu de temps alors à la fin seulement 20 000 résultats sont process pourtant plus, on avance et plus ça laisse de temps.
while ($dat = mysqli_fetch_object($lst)) {
Avez-vous une idée de comment je peux faire pour éviter ce souci svp ?

Merci beaucoup

Avatar du membre
Mammouth du PHP | 1609 Messages

08 sept. 2022, 16:00

Perso ce que je comprends c'est que tant que le while n'est pas terminé (tant que tu n'es pas allé au bout du result set), tu ne peux pas exécuter une autre requête sans avoir une erreur à moins de libérer la connexion. C'est tout, rien de plus rien de moins. Y a à priori aucune raison que le while ne parcourt pas l'ensemble du result set. Peut être que je comprends mal après car je n'ai jamais utilisé cette option.
Développeur web depuis + de 20 ans

Eléphant du PHP | 385 Messages

08 sept. 2022, 16:05

Merci dans cet article il semble qu'il ai un peu plus d'inconvénients
http://www.hackingwithphp.com/9/4/9/unb ... use_result
j'ai l'impression qu'il ya des issues
https://github.com/phpmyadmin/phpmyadmin/issues/17250

Je suis en 7.2

Eléphant du PHP | 385 Messages

14 sept. 2022, 08:35

Pour conclure, j'ai trouvé le problème.
Comme les threads prennent du temps j'ai un timeout qui fait perdre des résultats.
Conclusion, quand vous utilisez, il faut-être certains de ne pas avoir de processus très long et de récupérer les résultats.