PhP fuite mémoire

Bonjour,
Je voudrais signaler un bug concernant :
$buf = socket_read($socket, 1024);
socket_read() a une fuite de mémoire de quelques octets à chaque fois qu’elle est appelée.
Quand c’est dans un script, pas de souci, la mémoire est rétablie à la fin.

Par contre si elle est utilisée à l’intérieur d’un démon dans une boucle sans fin ce memory leak fini par croitre dangereusement.

De plus, au début il n’y a pas de fuite, puis au bout de quelques heures, la fuite commence pour, en plus, augmenter.

Au final le système n’a plus de mémoire et il faut relancer le démon pour revenir à la normale (cependant Jeedom semble être équipé de ce qu’il faut car il relance automatiquement le démon).

Si cela peut aider pour ceux qui auraient des pertes de mémoire :wink:

Merci pour l’info j’ai verifier mes plugins pour etre sur que je ne l’utilisai pas

Quel serait du coup le meilleur moyen de limiter l’impact de cette fuite mémoire ? Un cron pour fermer puis rouvrir le socket toutes les x heures ?

Perso je l’utilise dans un daemon pour faire du telnet et je n’ai pas vraiment constaté de difficulté dans jeedom pour l’instant…

Elle est où la fonction socket_read ? Tu aurai un exemple ?

Il y a pas mal de possibilité de memory leak avec les sockets, tout dépend comment ils sont construit, lu, fermé, la gestion des variables et des erreurs (qui sont construites même si il n’y a pas d’erreur) afin que le garbage collector les prennent en compte.

Mon socket_read est dans la fonction pull utilisée par le démon de mon plugin.
Le socket est ouvert au lancement du démon et fermé uniquement si on ferme ou redémarre le démon.

Pour la lecture, je fais comme cela :

     do { 
          $return.=socket_read(self::$_socket,4096);
          $status=socket_get_status(self::$_socket);
        } while ($status['unread_bytes']);

J’utilise d’autres sockets ailleurs dans mon plugin mais qui sont fermés dès que la lecture est terminée si j’attends un retour de ma commande ou direct après envoi de la commande si pas de retour attendu.

Tu vois un moyen de faire mieux que ça ?