[PHP] while(!feof($fp)) duurt te lang *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi mensen,

Ik heb een scriptje die een bepaalde actie naar een server stuurt. Het protocol op deze server stuurt mij een aantal regels terug op het command dat ik hem stuurde. Nou weet ik van te voren niet hoeveel regels de server mij gaat sturen. Ik gebruikte hiervoor ($fp is de fsockopen die een connectie maakt met de server) :

while(!feof($fp)) {
$data .= fgets($fp, 4096);
}

alleen dit duurt om de een of andere reden veel te lang (1 a 2 min). Ik heb ook geprobeert om de data in de while loop te controleren dus en aan de hand daarvan de while loop af te breken, duz :

while(!feof($fp)) {
$data = fgets($fp, 4096);
if(strlen($data) == 0) {
break;
} else {
$dataEcht .= $data;
}

alleen dit werkt ook niet. Heeft er iemand misschien een oplossing voor mij ? of een idee hoe ik het misschien zou kunnen proberen.
p.s met fread() i.p.v fgets maakt ook geen verschil.

B.V.D RuZ

[ Voor 4% gewijzigd door Verwijderd op 07-10-2003 10:29 ]


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:59

Reptile209

- gers -

Het klinkt alsof de server geen signaal stuurt dat het einde van de data markeert. En dus moet je dan wachten op de time-out van de verbinding. Is er echt helemaal niks in de data dat aangeeft hoeveel bytes je moet verwachten? Of kan je je time-out op bijvoorbeeld 10 seconden zetten in plaats van 1-2 minuten? Over wat voor protocol hebben we het eigenlijk?
* Reptile209 roept ook maar wat :)
offtopic:
Als je je code tussen [ code=taal] en [ /code] gooit, ziet het er wat sjieker uit...

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
We hebben het over het MSN protocol. Ik stuur mijn online status naar de server. Hij reageert in feite goed, al mijn online vrienden verschijnen in een array, alleen het duurt gewoon te lang. Ik krijg niet toegestuurd hoeveel bytes ik kan verw88. Het zou kunnen dat ik de timeout tijd op 10 sec zet, maar hoe doe ik dit ?

Acties:
  • 0 Henk 'm!

  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 12-09 09:30
PHP:
1
2
3
4
5
6
7
while(!feof($fp)) {
$data = fgets($fp, 4096);
if(strlen($data) == 0) {
break;
} else {
$dataEcht .= $data;
}


hier wacht je nog steeds op feof($fp), waarom gebruik je niet:

PHP:
1
2
3
4
5
6
7
while(true) {
$data = fgets($fp, 4096);
if(strlen($data) == 0) {
break;
} else {
$dataEcht .= $data;
}


dan vang je het echt zelf af...

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Je moet niet dom data in gaan lezen. Je kunt het beste parsen terwijl het binnenkomt. Op dat moment weet je exact waneer het bericht ten einde is en hoef je niet smerige en foutgevoelige timout code toe te voegen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Knoetje
  • Registratie: Februari 2001
  • Laatst online: 10-08 23:52
Bij mij progje die winamp zit te pollen heb ik de timeout op 1 gezet...

dit deed ik met fsockopen.

int fsockopen ( string target, int port [, int errno [, string errstr [, float timeout]]])

Alles is najagen van wind...


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:59

Reptile209

- gers -

Verwijderd schreef op 07 October 2003 @ 10:43:
We hebben het over het MSN protocol. Ik stuur mijn online status naar de server. Hij reageert in feite goed, al mijn online vrienden verschijnen in een array, alleen het duurt gewoon te lang. Ik krijg niet toegestuurd hoeveel bytes ik kan verw88. Het zou kunnen dat ik de timeout tijd op 10 sec zet, maar hoe doe ik dit ?
Aha, MSN :Y). Je moet gewoon alle LST en bijbehorende meuk per regel zien in te lezen. En dan kan je per commando (LST, BRP, whatever) een response opzetten.
Mijn eigen code (Delphi) zit vanaf het CHG nn NLN (wat ik als einde van het inloggen gebruik) alleen maar in een eindeloze lus complete regels (t/m een newline) uit te lezen en daar op te reageren. Volgens mij is het uitlezen met een buffer echt een stuk lastiger te implementeren, per regel is ideaal.

Edit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MainLoop()
{
  while (Connected)
    // wacht dus net zo lang totdat er 'iets' is ingelezen 
    Regel = LeesEenRegelIn() 
    // en parse dat
    VerwerkRegel(Regel)
}

VerwerkRegel(Regel)
{
  SplitsRegelInCommandoEnParameters(Regel, Commando, Param)
  case Commando of
    'LST': ...
    'ILN': ...
    'RNG': ...
}

Ik gebruik zelf de componenten van Indy (TIdTCPClient). Die hebben een hele handige WriteLn() methode ingebouwd zitten... :)

[ Voor 22% gewijzigd door Reptile209 op 07-10-2003 11:08 ]

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • kzin
  • Registratie: Oktober 2003
  • Laatst online: 18-09 15:03
Probeer het eens met fgetc(). fgets() wil perse een CR aan het einde hebben.
Je moet dan wel zelf of CR en/of LF testen.

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:59

Reptile209

- gers -

kzin: je wil *juist* lezen totaan de CR/LF, want daar wordt ieder commando mee afgesloten (MSG-commando's daargelaten, maar die kan je bufferen omdat je het aantal bytes daar weet).

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • hennink
  • Registratie: Augustus 2000
  • Laatst online: 11-09 16:49
Check anders libcurl eens.
Zie :http://curl.haxx.se/

[ Voor 35% gewijzigd door hennink op 07-10-2003 11:16 ]

alles wat aan kan, gaat kapot. De vraag is alleen wanneer.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke harstikke bedankt voor alle reacties. Ik ben er nog niet helemaal uit. De oplossing van BRAINLESS werkt niet, maar ik ben nou bezig met wat janoz en reptile zeggen ( de regel een voor een door te parsen ) ben nog niet zo bekend met php, maar ik denk dat ik er wel uitkom. Ik hoop dat het effect heeft op de snelheid. Ik laat wel weer weten als ik dit gedaan heb en ook als ik er niet meer uitkom. IIG Bedankt !

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
waarom staat er trouwens [C] voor mijn topic ? dit heb ik er helemaal niet ingezet ? maja...

Acties:
  • 0 Henk 'm!

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 18-09 16:46

RM-rf

1 2 3 4 5 7 6 8 9

Verwijderd schreef op 07 October 2003 @ 11:24:
waarom staat er trouwens [C] voor mijn topic ? dit heb ik er helemaal niet ingezet ? maja...
de reden daarvoor staat hier:
P&W Beleid

mensen die hier een vraag stellen worden verzocht de gebruikte taal te vermelden tussen brackets, een moderator heeft het nu voor jou gedaan, en deze ging ervanuit dat je C gebruikte, ipv dus kennelijk PHP (daarom is het dus aan te raden dit te doen, je kunt veel verwarring voorkomen door de gebruikte taal direkt aan te geven, en niet enkel een snipje uit je code)

verder kun je met dit knopje: Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/got/images/icons/edit.gif je eerdere post altijd editten als je wat toe te voegen hebt, ipv nieuwe posts onder je oude te zetten,

hth :)

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
oke bedankt en sorry :S niet mijn bedoeling het zo fout te posten :|

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Verwijderd schreef op 07 October 2003 @ 11:44:
oke bedankt en sorry :S niet mijn bedoeling het zo fout te posten :|
* curry684 keek te snel, zag feof en fread en typte [C]. Maar je hoort het dus zoals gezegd zelf te doen om dit soort verwarringen van honderden users te voorkomen :)

Professionele website nodig?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Uhmm ik probeer het nou te maken zoals reptile zei, ALLEEN nu heb ik dus een loop die kijkt of er regels binnenkomen, alleen die loop doet precies hetzelfde als mijn eerste probleem, deze BLIJFT de pagina aan het laden, hoe kan ik dit in php anders maken ?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik kom er niet uit. Ik zou graag van januz een voorbeeld willen over hoe ik het voor mekaar krijg om zodra er iets binnen komt het door te parsen ( in php ) ZONDER een oneindige while loop te gebruiken, of iig eentje die je niet ziet.

Alvast bedankt

Acties:
  • 0 Henk 'm!

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 18-09 16:46

RM-rf

1 2 3 4 5 7 6 8 9

Verwijderd schreef op 07 October 2003 @ 15:24:
ik kom er niet uit. Ik zou graag van januz een voorbeeld willen over hoe ik het voor mekaar krijg om zodra er iets binnen komt het door te parsen ( in php ) ZONDER een oneindige while loop te gebruiken, of iig eentje die je niet ziet.

Alvast bedankt
kicken is niet nodig, als iemand een antwoord geeft zal hij dat posten, verder is het niet de bedoeling om hier voor 'afhaal'-scriptjes te komen, en te vragen of anderen jouw scriptjes eventjes posten:

Reptile postte een stukje pseudo-code
Reptile209 schreef op 07 oktober 2003 @ 11:02:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MainLoop()
{
  while (Connected)
    // wacht dus net zo lang totdat er 'iets' is ingelezen 
    Regel = LeesEenRegelIn() 
    // en parse dat
    VerwerkRegel(Regel)
}

VerwerkRegel(Regel)
{
  SplitsRegelInCommandoEnParameters(Regel, Commando, Param)
  case Commando of
    'LST': ...
    'ILN': ...
    'RNG': ...
}
in de verwerkeenRegel-functie kun je de handelingen uitvoeren die je met je data wil bereiken:
zodra je dit afgehandeld hebt, zet je de variabele Connected op false, zodat de loop getremineerd wordt, dan wacht je niet op het einde van de file, maar gewoon totdat je de door jou gewenste handelingen hebt kunnen doen.

het handigste gaat dat door in de functie een return (handeling)?true:false te zetten en in het aanroepen die waarde toe te wijzen aan de variabele Connected: je retourneert dan true zolang je de door jou gewenste data/handeling nog niet hebt.

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
uuhm heb ik om een script gevraagd ? nee. Alleen om een oplossing. Jou oplossing is wel een goeie... bedankt !

Acties:
  • 0 Henk 'm!

Verwijderd

Je krijgt geen eof file bij een socket, alleen als de socket wordt gesloten
Pagina: 1