[PHP] feof in loop

Pagina: 1
Acties:
  • 128 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
Ik weet het, dit zelfde probleem is al meerdere malen voorbij gekomen maar ik kan de oplossing niet vinden. De gegeven oplossingen in de andere topics werken voor mij niet.

Ik heb de volgende code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
    $host = "www.nu.nl";
    $file = "/";

    $fp = fsockopen("$host", 80, $errno, $errstr, 30);
    stream_set_timeout($fp, 5);
    print "stap 1<BR>";     flush();
    if($fp)
    {
        $out = "GET $file HTTP/1.0\r\n";
        $out .= "Host: $host\r\n";
        $out .= "User-Agent: Mozilla\r\n";
        $out .= "Accept: text/xml,text/html,text/plain\r\n";
        $out .= "Accept-Charset: ISO-8859-1,utf-8\r\n";
        $out .= "Cache-Control: max-age=0\r\n";
        $out .= "Connection: Close\r\n\r\n";
        
        print "stap 2<BR>";     flush();
        $i=0;
        fputs($fp,"$out");
        print "stap 3<BR>";     flush();
            
        $i=0;
        $break=1;
        while(!feof($fp))
        {
            print "stap 4($i)<BR>";     flush();
            $content .= fgets($fp);
            $i++;
        }
        print "stap 5<BR>";     flush();
        fclose($fp);
    
        print "$content";
            
    }

?>


Ik probeer dus gewoon nu.nl te downloaden (gewoon om te testen). Nou werkt het de ene keer heel snel, de andere keer langzamer, en nog een andere keer blijft ie gewoon in een loop hangen. Hij blijft dan in stap 4 hangen, dus in de feof(). Het gekke is dat als ik deze code aanroep, hij het de eerste 2-3 goed doet, en daarna krijg ik de loop.
Wat ook raar is, is dat ik dus een timeout ingesteld heb, dat dus blijkbaar niet werkt. In andere topics was het probeem vaak dat de connectie niet geclosed werd, maar dat doe ik dus wel met Connection: Close\r\n\r\n, ik close de connectie zelf ook nog is er na met fclose. Ik snap er werkelijk niks meer van. Ik heb deze code op 2 verschillende servers geprobeerd, maar op beide heb ik het probleem. Een andere host dan nu.nl proberen lost het probleem niet op, want ik wil gewoon niet dat ie in een loop kan komen vast te zitten. Op php.net zie ik wel verschillende "oplossingen" maar dat werkt ook niet (http://nl3.php.net/feof).
Zie ik nou iets over het hoofd of wat :?

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Ik gebruik de volgende code om via een socketconnectie webpagina's op te halen, en die werkt goed. De voornaamste verschillen zijn dat ik een bufferlength heb bij fgets() en fwrite() gebruik om de request headers te versturen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
$conn = @fsockopen($url['host'], 80, $errno, $errstr, 2);
        
        if (!$conn)
            {
                $content='<p class="error">Connection failed. Make sure the <acronym title="Uniform Resource Locator">URL</acronym> you entered ('.$url['host'].') is valid.</p>'."\n";
            }
        else
            {
                $out = (@$_POST['request_type'] == 'head' OR !isset($_POST['request_type'])) ? 'HEAD '.$path.' HTTP/1.1'."\r\n" : 'GET '.$path.' HTTP/1.1'."\r\n";
                $out .= 'Host: '.$url['host']."\n";
                $out .= 'User-Agent: HeaderViewer/v0.4 (http://www.atlex.nl/stuff/headerviewer)'."\n";
                $out .= 'Accept-Encoding: text/xml;application/xml;application/xhtml+xml;text/html;text/plain'."\n";
                $out .= 'Accept: text/xml;application/xml;application/xhtml+xml;text/html;text/plain'."\n";
                $out .= 'Accept-Encoding: gzip,deflate'."\n";
                $out .= 'Connection: Close'."\r\n\r\n";
                
                fwrite($conn, $out);
                
                $data='';
                while (!feof($conn))
                    {
                        $data.=fgets($conn, 128);
                    }
                fclose($conn);
                
                //Text doorlopen en dan de headers eraf halen:
                $headers=substr($data, 0, strpos($data, "\r\n\r\n")+4);
                
                $content='<h2>Response data:</h2>'."\n";
                $content.= '<div id="code">'."\n";
                $content.='<pre>'.htmlentities($headers).'</pre></div>';
                
                if (@isset($_POST['request_type']) AND $_POST['request_type'] == 'get')
                    {
                        $content.='<p><strong>Pagesize:</strong> '.strlen($data).' bytes.';
                        (eregi('gzip', $data)) ? $content.=' I received Gzip compressed data, the page would be around '.round(strlen($data)*1.7).' bytes (estimated) without compression.</p>' : $content.='</p>';
                    }
                    
                if (isset($_POST['sentheaders']))
                    {
                        $content.='<h2>Headers sent:</h2>'."\n";
                        $content.= '<div id="code">'."\n";
                        $content.='<pre>'.htmlentities($out).'</pre></div>';
                        
                        $formvalue_sentheaders='checked="checked"';
                    }   
            }

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
Weet je dat zeker? Bij mij namelijk niet, op beide servers.
Hij blijft ook hangen in de feof.
Ik heb er even boven gezet:
code:
1
2
$url['host'] = "www.nu.nl";
$path = "/";


en onderaan:
code:
1
print "$conent";


Dmv print en flush zie ik dat ie in de feof blijft hangen. Heb je wel geprobeerd om deze code meerdere malen achter elkaar te runnen? 10x ofzo? Het lijkt namelijk wel alsof er iets vol loopt, geheugen ofzo..

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

probeer

PHP:
1
<? $input = file_get_contents("http://www.nu.nl");


verder zou een
PHP:
1
2
3
4
while (!feof($filelink)) 
{
 // doejeding
}

moeten werken als een trein.

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
Klopt, alleen ik wil het graag met fsocketopen doen omdat ik de headers zelf wil mee sturen en kunnen uitlezen :)

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

FireFoz schreef op vrijdag 19 januari 2007 @ 13:59:
Klopt, alleen ik wil het graag met fsocketopen doen omdat ik de headers zelf wil mee sturen en kunnen uitlezen :)
probeer dan misschien:
PHP:
1
2
3
4
while($fp && !feof($fp))
{
// doejeding?
}

(je kunt trouwens ook even kijken naar CURL voor dit soort operaties :) )

[ Voor 12% gewijzigd door SchizoDuckie op 19-01-2007 14:05 ]

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
Het lijkt er op dat ik dit probleem alleen bij nu.nl heb, dat is toch wel vaag.

@SchizoDuckie: Dat maakt geen verschil. CURL zou kunnen werken, maar het moet toch ook gewoon zo kunnen?

-edit- hmm dit is wel vaag, als ik met telnet naar www.nu.nl connect, dan sluit de server de verbinding al meteen na
code:
1
GET / HTTP/1.0
:?

met 1.1 het zelfde

mss dat ze een soort van "beveiliging" hebben dat hun nieuwsberichten niet makkelijk gejat kunnen worden ofzo. Niet dat ik dat van plan ben, maar als er meer servers zijn die zo reageren dan geeft het wel problemen op. Het is iig niet standaard volgensmij..

[ Voor 57% gewijzigd door FireFoz op 19-01-2007 15:53 ]

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

probeer:

code:
1
GET / HTTP 1.0


[edit]
zelfs alleen GET / werkt

Waarom had je überhaupt die / tussen de http en de 1 staan :?

[ Voor 50% gewijzigd door SchizoDuckie op 19-01-2007 16:32 ]

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
Omdat dat de standaard is volgens mij
http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html

en bij mij werkt het echt niet...ik connect met telnet naar www.nu.nl op poort 80
daar type ik in

GET /

vervolgens krijg ik connection closed by remote host. :/

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
;; QUESTION SECTION:
;www.nu.nl.                     IN      A

;; ANSWER SECTION:
www.nu.nl.              161     IN      CNAME   gl.nu.nl.
gl.nu.nl.               13      IN      A       62.69.179.208


Klopt dat IP-adres?

Want als ik een `GET /` doe naar www.nu.nl, dan krijg ik toch echt content terug.

Acties:
  • 0 Henk 'm!

Verwijderd

Is het niet makkelijker om curl daarvoor te gebruiken?

Acties:
  • 0 Henk 'm!

  • Ajunne
  • Registratie: December 2001
  • Laatst online: 09-09 11:38

Ajunne

Uitje

[b][message=27341101,noline]SchizoDuckie schreef op vrijdag 19 januari 2007 @
Waarom had je überhaupt die / tussen de http en de 1 staan :?
Omdat dat nu eenmaal de definitie van het HTTP protocol is?

@ TS: Wat is er mis met $content = file_get_contents("http://www.nu.nl/"); Er is geen reden om het wiel opnieuw uit te vinden

Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Ajunne schreef op vrijdag 19 januari 2007 @ 18:11:
[...]

@ TS: Wat is er mis met $content = file_get_contents("http://www.nu.nl/"); Er is geen reden om het wiel opnieuw uit te vinden
FireFoz schreef op vrijdag 19 januari 2007 @ 13:59:
Klopt, alleen ik wil het graag met fsocketopen doen omdat ik de headers zelf wil mee sturen en kunnen uitlezen :)
:)

Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

conclusie: Stoei eens wat met libcURL. Er zijn mooie classes voor te vinden die het super simpel maken voor je.

Don't reinvent the wheel...

Stop uploading passwords to Github!

Pagina: 1