Am o intrebare legata de citirea unui Json stream.
Eu am nevoie sa citesc un json stream(cu cote, pariuri sportive)
Acest json stream imi vine pe socketul localhost:8992.
In documentatia acestuia, mi se spune ca:
All messages sending to your application will form a JSON stream (no delimiter between messages), so you may need a decoder that support JSON stream. Each message will have a type property to indicate what type it is. You can use this property to decide what to do with the messages.
Eu pana acum, nu am folosit niciodata asa ceva. Mereu m-am “jucat” cu stringuri.
Am gasit pe net libraria asta:
Am instalat-o corespunzator, de asta sunt sigur. Am testat folosind exemplele furnizate.
Dar cand incerc sa o folosesc pe ce am eu nevoie, si anume citirea unui json stream de pe socketul localhost:8992
nu merge.
Nu imi da nici o eroare, nu se intampla pur si simplu nimic.
In exemplul oferit de salsify, se citea un json pur si simplu.
Ca sa citesc de pe socketul meu, am schimbat liniile:
Nu merge. E prea mare. Nu e un string, e un stream. Deci vin mesaje incontinuu, 4-5 pe secunda chiar.
Eu trebuie sa citesc “bucati” din stream, bucati destul de mari incat sa nu crape memoria php-ului.
Trebuie sa faci un buffer, sa salvezi streamul pe o anumita perioada, sa afisezi/salvezi datele care iti trebuie in obiecte/array-uri si sa stergi din buffer ce ai procesat.
Nu stiu de unde sa incep in a face treaba asta. M-as fi asteptat sa pot face asta cu libraria mai sus mentionata. Nu asta ar fi trebuit sa faca?
Te rog indruma-ma in directia potrivita. Eu am primit de la cei care au imi pun la dispozitie json stream-ul, un exemplu de php.
Il pun mai jos. Cum as putea sa ma folosesc de asta, si sa folosesc buffere?
PS. Intre timp mai caut pe net, evident, dar un raspuns de la cineva care stie cu ce se mananca bufferele, m-ar ajuta mult.
Libraria aceea e construita pentru a o folosi cu fisiere json. La o prima vedere libraria asteapta sa citeasca linii(ii trebuie un ‘\n’ din cand in cand in stream pentru a continua procesarea). In functie de cum e formatat stream-ul json, e posibil sa nu ai asa ceva. Ai putea sa incerci sa inlocuiesti ‘\n’ cu ‘}’ folosind constructorul:
$parser = new \JsonStreamingParser\Parser($stream, $listener, "}");
In cazul asta posibil sa trebuiasca sa adaugi la buffer caracterul folosit pe post de sfarsit de linie (stream_get_line parca nu intoarce si caracterul de sfarsit de linie). Sau sa folosesti alt caracter pe post de sfarsit de linie care nu conteaza in json(‘spatiu’ daca este folosit in stream).
Daca tot nu merge, posibil sa trebuiasca sa modifici putin libraria pentru cazul tau de folosinta.
Functia la care cred ca trebuie sa te uiti este:
Poti sa folosesti si exemplul dat de ei. tot ce trebuie sa faci este sa completezi functia processMessage:
function processMessage($message) {
// $message aici contine un obiect codat json
$obj = json_decode($message);
// aici extragi ce informatii te intereseaza din $obj
}
La o vizionare mai atenta, nu prea are nici o logica while-ul din exemplul lor. Ar trebui sa fie: