Requete HTTP com_http curl & daemon plugin

Bonjour
Dans la lignée de mes derniers messages pour faire évoluer un plugin et l’ajout de device, je fais des requetes HTTP au device via com_http dans la fonction du daemon du plugin.
L’appel à la fonction pull de ce daemon est récurente.
Pas de soucis la dessus

Hors la requete com_http donc curl que je fais dedans est bloquante.
C’est à dire qu’on ouvre un flux sur le device qui pousse ces infos XML au fur et à mesure.

J’ai 2 soucis

  • dès le 1er appel, la fonction exec de la requete est bloquante. Elle ne rend jamais la main donc encore moins avec les données XML dedans. Alors que le device envoie toutes les 7 secondes des infos
  • la function pull est appelé à nouveau et indéfiniment, donc j’ai l’impression qu’on créee une multitude de requete sur le device qui finit donc par planter… Seule chose positive que j’ai constaté c’est que cet appel à Pull à lieu toutes les 7 secondes, en lien donc probablement avec la remontée d’info…

Selon vous, comment pourrais-je traiter ces 2 problème ?
Voici le code dans ma fonction pull dédiée

$url .= '/ISAPI/Event/notification/alertStream';
	$request_http = new com_http($url, $_eqLogic->getConfiguration('username'), $_eqLogic->getConfiguration('password'));
    $result = $request_http->exec();

Hello,

Le premier param de la commande exec est un timeout en seconde. Le second c’est le nombre de réessais

Si tu veux un stream il faut passer par un vrai démon car php est synchrone dans ce cas, ou bien jouer avec du long polling (a voir si supporté par ton serveur)

le problème c’est que la fonction exec ne rend jamais la main. Sauf si je met un timeout.
Une fois la connexion établie, elle envoit son flux mais je ne sais pas ou le récupérer (comme la fonction ne rend pas la main). Via une callback je suppose mais je ne sais pas comment la passer dans la classe com_http. Je n’ai d’ailleurs rien vu de tel dans la doc jeedom.

1 « J'aime »

Non on ne peut pas faire du polling.
C’est forcément un stream. le device fait office de serveur. le client (mon plugin) se connecte via un curl. Puis le device doit envoyer au fil de l’eau.
Ca marche en tout cas en ligne de commande bash avec un curl -X
Mais je n’arrive pas à récupérer les data dans le plugin

Si j’étais toi je passerais par un vrai démon en python ou nodejs… un vrai langage asynchrone

1 « J'aime »