webForumDet fria alternativet

fgets skickar med extra tecken för dynamiska sidor

PHP

2 svar · 424 visningar · startad av foks

Medlem sedan juli 200280 inlägg
Frågan#1

Jag använder nedanstående script för att automatiskt hämta hem html-filer:

$fp = fsockopen("195.47.247.95", 80, $errno, $errstr, 10 );
if($fp)
{
  $out  = "GET /test.php HTTP/1.1\r\n";
  $out .= "Host: www.foks.se\r\n";
  $out .= "Connection: close \r\n";
  $out .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4\r\n\r\n";
  fwrite($fp, $out);
  while (!feof($fp))
  {
    echo fgets($fp,4096);
  }
}

När jag hämtar hem test.html fungerar allt som det ska och jag får detta resultat:

HTTP/1.1 200 OK
Date: Mon, 28 Jul 2008 18:31:49 GMT
Server: Apache
Last-Modified: Mon, 28 Jul 2008 18:04:29 GMT
ETag: "1908ee28-c-488e0a2d"
Accept-Ranges: bytes
Content-Length: 12
Connection: close
Content-Type: text/html

abc
def
ghi

Men när jag hämtar hem test.php som är exakt likadan, förutom filändelsen, blir resultatet:

HTTP/1.1 200 OK
Date: Mon, 28 Jul 2008 18:26:37 GMT
Server: Apache
X-Powered-By: PHP/5.2.6
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

c  
abc
def
ghi

0

De tecken som inte finns med i originalfilen (och inte syns i webbläsare) är alltså c och 0 (och några radbrytningar). Jag får bara detta problem med sidor som skapas dynamiskt, tex php-script.

Någon som har gissning om vad problemet kan vara? https://www.foks.se är min domän och test.html och test.php är korta testfiler, så det är fritt fram att testa med dem. :)

Medlem sedan mars 20007 896 inlägg
#2

Det är Apache - inte PHP - som lägger till den här informationen, och inte bara på just PHP-filer - utan som sagt på alla dynamiska filer. Jag vet inte vad det beror på dock, eller vad det har för information. Jag skulle gissa på att den avslutande nollan åtminstone är EOF-tecken (End Of File), och att den läggs till för att tala om var webläsaren (eller i ditt fall fgets()) ska sluta att hämta information. Med statiska filer (.htm/.html) anger Apache istället en header för längden på filen (Content-Length).

Spekulationer mestadels. Och inget ordentligt svar... ;)

Medlem sedan juli 200280 inlägg
#3

Ibland räcker det med spekulationer. :)

Jag sökte vidare om Apache och hittade en diskussion om samma problem.

Det verkar vara så att HTTP/1.1 lägger till dessa tecken som innehåller information. Som ett tillfälligt fulhack kan jag alltså köra HTTP/1.0 som inte har samma "problem", sen får jag väl läsa in mig mer på HTTP-standarden.

Tack SPiN för att du ledde mig på rätt väg. (y)

254 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)