[php] niet werkende url opsporen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ik wil in een loop van bepaalde urls wat gegevens ophalen. Echter werkt dit met file_get_contents goed, totdat een url geen 404 geeft of niet echt bestaat.

Ik probeer het alsvolgt te testen:

test.php (bestand om timeout te simuleren)
PHP:
1
sleep(1000);


Als ik dit bestandje met file_get_contents ophaal, duurt het heel lang voordat deze aangeeft dat het iet een geldige url is.

Dit wil ik graag sneller hebben. Ik probeer het dus te testen met een socket connecte alsvolgt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$url = "http://www.eendomein.nl/test.php";
$url = parse_url($url);
print_r($url);
$fp = fsockopen($url["host"],80);
if (!$fp) {
   echo "Unable to open\n";
} else {

   fwrite($fp,"GET ".$url["path"]." HTTP/1.0\r\n\r\n");
   stream_set_timeout($fp,2);

   $info = stream_get_meta_data($fp);
   
   print_r($info);
   fclose($fp);

   if ($info['timed_out']) {
       echo 'Connection timed out!';
   } else {
       echo "OK";
   }

}


Wat ik ook probeer, hij geeft aan dat het bestand okee is terwijl dat niet zo is. na 2 seconden zou die moeten stoppen en connection timeout moeten echo-en!

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
persoonlijk gebruik ik altijd deze:
PHP:
1
2
3
4
5
6
    function url_exists($url) {
        $handle = @fopen($url, "r");
        if ($handle === false) return false;
        fclose($handle);
        return true;
    }

ik zie dat jij veel meer checkt, maar vraag me af of het resultaat anders is (zou zijn) ja dus (ff lezen bas)

[ Voor 4% gewijzigd door BasieP op 13-02-2007 21:31 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

Verwijderd

je zou de maximale executietijd van je script op 2 seconden kunnen zetten, maar dan kun je dr ook niets mee :-)

Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
url_exists gaat net zo lang door! Ik wil dat als hij na 5 seconden ofzo niks heeft gevondne hij naar de volgende gaat!

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Kijk eens bij de handleiding onder stream_set_timeout: je moet eerst proberen van de stream te lezen voordat je een error kunt krijgen.

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
kan je niet gewoon op de een of andere manier alleen de http header opvragen? dus gewoon stoppen na de headers?

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
als ik

$res = fread($fp, 2000);

na stream_set_timeout doe dan geeft hij nog hetzelfde!

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
RSD schreef op dinsdag 13 februari 2007 @ 21:40:
als ik

$res = fread($fp, 2000);

na stream_set_timeout doe dan geeft hij nog hetzelfde!
Dan wordt je script niet goed aangeroepen en krijg je wel binnen 2s een respons. Dit kun je makkelijk testen met een sniffer. De meest voordehandliggende oorzaak is dat je geen Host-header meestuurt, en het bestand staat op een server die gebruik maakt van virtualhosts.

Acties:
  • 0 Henk 'm!

Verwijderd

Met CURL is dit waarschijnlijk makkelijker op te lossen.

Daarbij kun je veel meer instellen en die geeft ook netjes HTTP error codes terug bijvoorbeeld bij een 500.

Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Met curl heb ik ook al een en ander geprobeerd, maar als ik dan als url "aaassdfxsdg" opgaf bijvoorbeeld, dan gaf hij een pagina op mijn server die ik normaal alleen krijg als ik geen index.php of index.html in de root heb staan.

Ik heb wel meerdere sites idd op mijn server..

Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
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
function glue_url($parsed) {
    if (! is_array($parsed)) return false;
    $uri = isset($parsed['scheme']) ? $parsed['scheme'].':'.((strtolower($parsed['scheme']) == 'mailto') ? '':'//'): '';
    $uri .= isset($parsed['user']) ? $parsed['user'].($parsed['pass']? ':'.$parsed['pass']:'').'@':'';
    $uri .= isset($parsed['host']) ? $parsed['host'] : '';
    $uri .= isset($parsed['port']) ? ':'.$parsed['port'] : '';
    $uri .= isset($parsed['path']) ? $parsed['path'] : '';
    $uri .= isset($parsed['query']) ? '?'.$parsed['query'] : '';
    $uri .= isset($parsed['fragment']) ? '#'.$parsed['fragment'] : '';
    return $uri;
}

function file_get_content($url) {
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
    return curl_exec($ch);
    curl_close($ch);
}


$url = "http://www.domein.nl/test.php";
$url = parse_url($url);

if ($url) {
    $url = glue_url($url);
    $content = file_get_content($url);
    if ($content) {
        echo $content;
    } else {
        echo "timed out !!";
    }
}


dit is met curl gedaan, dat werkt ook niet, hij blijft nu in de loop hangen!

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Wanneer je meerdere url's wil checken dan zou ik niet gaan wachten op iedere socket connectie en meerdere non blocking sockets te gelijk openen. Iedere loop iteratie check je welke sockets data opleveren en handel je af.

Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Het gaat om meer dan 1 miljoen links.... heb ik dan niet straks 1 miljoen socket connecties open?

Acties:
  • 0 Henk 'm!

Verwijderd

Je zou de documentatie van CURL beter na moeten lezen.

curl_exec geeft geen false terug op het moment dat er iets mis is gegaan.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
RSD schreef op woensdag 14 februari 2007 @ 10:23:
Het gaat om meer dan 1 miljoen links.... heb ik dan niet straks 1 miljoen socket connecties open?
Je kunt ze per 10 of per 100 verwerken natuurlijk. Is het nou al gelukt met fread en de Host-header? Want ik denk niet dat curl meerdere dingen tegelijk kan verwerken.

Acties:
  • 0 Henk 'm!

Verwijderd

GlowMouse schreef op woensdag 14 februari 2007 @ 12:14:
[...]

Je kunt ze per 10 of per 100 verwerken natuurlijk. Is het nou al gelukt met fread en de Host-header? Want ik denk niet dat curl meerdere dingen tegelijk kan verwerken.
CURL kan zeker wel meerdere dingen tegelijk verwerken, en sinds PHP5 kan je dat in PHP ook.

@TS:

Ga eerst heel je lijst af met een goede reg-ex om te bekijken welke URL's uberhaupt ook echt URL's zijn.

Daarna netjes verwerken met CURL, daarbij niet de hele content uitlezen maar alleen de eerste paar bytes en dan de header controleren.

Een timeout moet je nu eenmaal niet te krap zetten, dus bijvoorbeeld 5 sec of 10 sec.

Door curl meerdere dingen tegelijk te laten verwerken moet je de hele lijst van een miljoen url's in ongeveer 10 min verwerkt hebben.

[ Voor 38% gewijzigd door Verwijderd op 14-02-2007 12:27 ]


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
In 10 min????? Nou dat gaat mij echt niet lukken. Ben nu weer met fsocketopen bezig en dat gaat per link...

Daarnaast zou ik niet weten hoe ik pakketjes van 100 kan doen. Als de ene gedaan is in een loop, dan moet de volgende toch pas?

De url controleren lukt me wel met parse_url en erna weer vast lijmen.

Acties:
  • 0 Henk 'm!

Verwijderd

Uit de documentatie:

http://nl2.php.net/parse_url

This function is not meant to validate the given URL, it only breaks it up into the above listed parts. Partial URLs are also accepted, parse_url() tries its best to parse them correctly.

Gebruik dus gewoon een regex, dat is sneller en werkt beter.

http://nl2.php.net/manual/en/ref.curl.php

Daar staat alles wat je nodig hebt.

De curl_multi functies heb je nodig om meerdere dingen tegelijk te doen (en daar staan ook genoeg voorbeelden bij).

Lees de documentatie goed, dan kom je er makkelijk uit.

Het is niet zo nuttig om het hele HTTP protocol via fsocketopen te gaan emuleren als je een perfecte curl bibliotheek hebt die alles kan doen wat je nodig hebt zonder veel moeite.

Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Helaas heb ik geen php 5 op die server staan... ik kan hem wel upgraden, maar dan ben ik bang dat alles in de soep gaat lopen. Heb al geprobeerd om dan remote te connecten, maar dat krijg ik ook niet voor elkaar... :-(
Pagina: 1