[PHP] feof (fsockopen ()) duurt altijd 17 seconden te lang

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
als ik met volgende code een pagina download dan zie je dat het laatste lijntje ontvangen altijd 17 seconden duurt. Dit terwijl de rest van de pagina in minder dan 1 seconde afgerond wordt.
PHP:
1
2
3
4
5
6
7
8
9
10
$fs = fsockopen("www.bs.be", 80, $errno, $errstr, 20);
$buffer2="";
fputs($fs, $request);
while (!feof($fs)) {
  $buffer2 = fgets($fs, 2048);
  $datum = date("H:i:s");
  echo "$datum ontvangen $buffer2<br>";
  $buffer1 .= $buffer2;
  }
fclose ($fs);
het resultaat hiervan is:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
21:00:35 ontvangen HTTP/1.1 200 OK
21:00:35 ontvangen Date: Tue, 09 Aug 2005 18:58:31 GMT
21:00:35 ontvangen Server: Apache/1.3.33 (Unix) mod_auth_passthrough/1.8 mod_log_bytes/1.2 mod_bwlimited/1.4 PHP/4.3.11 FrontPage/5.0.2.2635 mod_ssl/2.8.22 OpenSSL/0.9.7a
21:00:35 ontvangen X-Powered-By: PHP/4.3.11
21:00:35 ontvangen Expires: Thu, 19 Nov 1981 08:52:00 GMT
21:00:35 ontvangen Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
21:00:35 ontvangen Pragma: no-cache
21:00:35 ontvangen Keep-Alive: timeout=15, max=100
21:00:35 ontvangen Connection: Keep-Alive
21:00:35 ontvangen Transfer-Encoding: chunked
21:00:35 ontvangen Content-Type: text/html
21:00:35 ontvangen
21:00:35 ontvangen df0
21:00:35 ontvangen <html>
21:00:35 ontvangen blabla
21:00:35 ontvangen </html>
21:00:35 ontvangen 0
21:00:35 ontvangen
21:00:52 ontvangen

Een oplossing zou zijn bvb de lijn in een variabele zetten en dan 1 seconde wachten en controleren of de lijn nog hetzelfde is. Indien niet ==> fclose($fs);
Maar het probleem hierbij is dat je telkens bijna een seconde verliest en dat dit ook nog redelijk veel is (en moest er bvb een seconde lag zijn, dan denkt hij dat de volledige pagina verstuurd is en dit kan problemen veroorzaken want ik werk soms met strrpos = zoek laatste string)

Heeft niemand een beter voorstel?

PS: Wat zijn die rare tekens telkens tussen de header en de html-tags (in dit geval de fictieve df0)?

Acties:
  • 0 Henk 'm!

Verwijderd

Welke request stuur je precies?
Zie je trouwens die Connection: Keep-Alive header? Als je daar om vraagt is dat natuurlijk het probleem. En die df0 komt door de Transfer-Encoding: chunked. Je kunt vast wel zelf opzoeken hoe je dat kunt decoden.

Acties:
  • 0 Henk 'm!

  • Kuhlie
  • Registratie: December 2002
  • Niet online
Wat Cheatah zegt: je moet zelf Connection: close sturen, dan ben je van je probleem af.

Edit: en als je zegt dat je alleen HTTP/1.0 snapt dan krijg je die rare hex-codes ook niet.

[ Voor 36% gewijzigd door Kuhlie op 09-08-2005 22:54 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Door http1.0 op te vragen sluit de connectie nu direct en zijn de rare tekens idd verdwenen.
Het had ook opgelost kunnen worden door de tekens decimaal te maken (hexdec()) en dan strpos substr maar dit kost wat extra processorkracht + bandbreedte tenzij je meerdere bestanden tegelijk wil downloaden met pfsockopen maar dit is hier niet van toepassing denk ik

bedankt voor het advies :)