[PHP] Sockets parallel draaien met stream_set_blocking?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 15:28
Het probleem waar ik mee zit is het volgende:

Ik roep vanuit een bepaalde interface (web, XML of e-mail) een script aan, dat de meegestuurde data uitleest en bepaalde acties, al dan niet naar derde partijen, onderneemt.

Een voorbeeld:
- ik stuur via XML een request voor het maken van een klant-record
- het script maakt intern het klant-record aan
- het script maakt bij externe partij 1 een klant-record aan via een socket-verbinding
- het script maakt bij externe partij 2 een klant-record aan via een socket-verbinding
- het script stuurt mij het resultaat van het interne toevoegen (een handle) terug

Het aanmaken van het eigen, interne record gaat snel, maar het vervolgens aanvragen van een externe handle en wachten op een antwoord hiervan duurt lang, en dat moet meerdere keren gebeuren, terwijl dat eigenlijk op de achtergrond kan gebeuren omdat de externe gegevens niet direct nodig zijn.

Mijn idee om deze onacceptabel lange wachttijden te voorkomen is dus dat ik eerst de interne gegevens op orde maak, dan de twee externe processen 'aanschiet' zonder op antwoord te wachten, en terwijl de externe partijen bezig zijn stuur ik vast de interne handle terug en beeindig ik het script.

Ik kwam uit op het (un)blocken van streams onder PHP met behulp van de functie stream_set_blocking, maar ik kan nergens documentatie vinden over het hoe en wat hiervan.

Mijn voornaamste vraag, buiten de vraag of dit inderdaad de manier is om mijn probleem op te lossen, is: hoe vang ik de resultaten van de socketstreams af? Ik kan wel parallel twee sockets openen, maar wanneer en hoe moet ik het antwoord uitlezen?

Acties:
  • 0 Henk 'm!

  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

In the manual staat toch het antwoord op je vraag:
bool stream_set_blocking ( resource stream, int mode )
If mode is FALSE, the given stream will be switched to non-blocking mode, and if TRUE, it will be switched to blocking mode. This affects calls like fgets() and fread() that read from the stream. In non-blocking mode an fgets() call will always return right away while in blocking mode it will wait for data to become available on the stream.

[ Voor 8% gewijzigd door Explore op 19-11-2003 18:55 ]

[ specs ] [ Tweaker gallery ]


Acties:
  • 0 Henk 'm!

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 15:28
Zover was ik ook al; maar mijn vraag is hoe je dan de output afvangt, als je er niet op wacht? Dus je bent intussen al lang met een ander stuk code bezig, hoe weet je dan of en wat er terugkomt?

Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

Ik kan je vraag niet meteen beantwoorden over dat non-blocking. Ik neem aan dat dat in andere talen gaat met een interrupt en ergens wat geheugen enzo, maar dat is er allemaal niet in PHP. Dus ik zou het anders oplossen.
Als je het script onder Linux draait zou ik je eerste PHP script twee andere (of dezelfde met een andere aanroep) laten executen in de achtergrond. Zie manual over het executen van andere programma's vanuit PHP. In Linux moet je een &-teken achter de aanroep zetten om een programma in de achtergrond te draaien. In windows moet je er 'start' voorzetten, dan wordt er een nieuwe DOS-box gecreeerd geloof ik (hou me er niet aan vast, heb ik nog nooit geprobeerd).

In feite fork je dus 2 nieuwe scripts. Je moet natuurlijk wel die gegevens mee geven aan die nieuwe scripts, die zullen het dus uit je database moeten halen, maar dat is denk ik geen probleem. Ik denk dat het wel mogelijk is om argumenten mee te geven op de commandline. Als dat kan, dan kan je de id van dat account meegeven. Anders kan je hopen dat het script nooit 2 keer tegelijk wordt aangeroepen en dat je de 'max' id uit de db kan halen.

Succes.

"Beauty is the ultimate defence against complexity." David Gelernter