Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

[PHP] pingen naar sites

None
11 antwoorden
  • Hey,

    momenteel ben ik bezig met een scriptje wat controleert of de links uit mijn Favorietenfolder nog werken. 't Gaat hierbij vooral om het oefenen met PHP, veel minder om het controleren van die links (daar zijn immers andere programma's voor) :)

    Wat ik nu doe is dit:
    1. Ik ga naar de folder "Mijn Favorieten".
    2. Ik scan alle bestanden in die map, inclusief directories.
    3. Ik haal de bijbehorende URL's uit de *.url bestanden met file_get_contents en een reguliere expressie
    4. Ik wil de urls pingen of op een andere manier controleren of de site überhaupt nog bestaat (evt. de titel van de favoriete link controleren)

    Nu loopt het bij 4 niet meer goed: de functie system("ping $link"); lijkt alleen te werken op sites als www.hotmail.com, en niet op subpaden van die sites en ook niet op websites die zonder de www. beginnen (alhoewel de 'gewone' ping dat wel doet).
    Naast die functie wil ik fopen gebruiken om te kijken of die sites nog bestaan (omdat die ping dus niet goed werkt), maar ook dat werkt niet helemaal ok, bovendien vreet het tijd (die manier had ik op www.php.net gevonden).
    Ook een socket openen werkt niet goed: krijg een rare error die niet vaak voorkomt op het internet ("Unable to find the socket transport "http" - did you forget to enable it when you configured PHP?") Weet dus ook niet hoe dat op te lossen.

    Mijn vraag aldus: [b:0aea9bc981]op welke wijze kan ik het beste die URL's pingen (dus ook met subpaden en dergelijke) en uiteraard is advies ook zéér welkom[/b:0aea9bc981] :wink:

    [b:0aea9bc981]Edit:[/b:0aea9bc981]
    Wellicht overbodig om te vermelden: ook niet alle sites staan het toe dat een socket wordt geopend (en ik denk ook niet fopen), waardoor de resultaten onbetrouwbaar worden. Ik wilde dus eigenlijk een combinatie van bovengenoemde opties uitvoeren, maar dat is dus waarschijnlijk ook onbetrouwbaar. Iemand een idee voor een betrouwbare uitkomst?
    Ikzelf had het idee om sites die fopen ondersteunen in te lezen en te kijken naar de woorden tussen de <title></title>: zijn die gelijk aan de naam van de favoriet, dan bestaat de site nog. Enige probleem dan is dat het niet werkt indien a) de website overal dezelfde naam heeft of b) wanneer je zelf de naam van de favoriet gewijzigd hebt.
  • Een ping kan niet naar een internet URL. Een ping voor je uit naar een host, dus een ip-adres, domeinnaam, windows-hostname, enz.

    De beste optie is dus het openen van een socket (op poort 80) of werken met fopen. Een gewone http-request zouden deze sites gewoon moeten accepteren lijkt me.
  • Maar hoe kan je dan zo'n HTTP request uitvoeren? Gewoon een socket openen of moet je ook nog wat versturen? Want als ik nu een socket open, reageren sommige sites wel, maar de meeste niet.
    Ik had gelezen dat dat kon komen omdat niet iedere site een binnenkomende socket accepteert?

    Het aanroepen van een site met fopen doe ik zo:
    [code:1:6bc5e9e4e4]
    $fp = @fopen($link, 'r');
    if($fp)
    return TRUE;
    else
    return FALSE;
    [/code:1:6bc5e9e4e4]

    De functie die ik gebruik met fsockopen heb ik rechtstreeks van php.net gehaald: klik!. Van de zelf-geschreven functies die daar staan leek dat me wel een goede 8)
  • [quote:07b75a7d8e="psychonetics"]Maar hoe kan je dan zo'n HTTP request uitvoeren? Gewoon een socket openen of moet je ook nog wat versturen? [/quote:07b75a7d8e]
    Zie voorbeeld 1 in de manual van fsockopen.
  • Hmmm….dan krijg ik die error weer: Unable to find the socket transport "http" - did you forget to enable it when you configured PHP? (105667560)

    Zal eens kijken in php.ini of ik iets kan vinden, maar tips zijn welkom :-?

    [b:f5b924879e]Edit:[/b:f5b924879e] ik kan niks vinden in php.ini :cry:
  • Kan je hier wat mee?
    http://wiki.cc/php/Unable_to_find_the_socket_transport

    gevonden door in google te zoeken op je foutmelding.
  • Hmm…die was ik nog niet tegengekomen. Maar via een link op die pagina kom je op php_sockets.
    Daar staat geen http tussen, dus denk ik niet dat je http kan aanroepen via een socket? :roll:
  • Error Message: Unknown message.■√²ⁿ
  • fopen gebruikte ik inderdaad al, maar die lijkt ook niet helemaal te werken :oops:

    Maar die CURL had ik nog niet gezien, bedankt! Ik ga er eens naar kijken en uitzoeken wat dat is :lol:

    Als het dan nog niet werkt kom ik wel weer terug :wink:
  • Oke, ik heb nu dit:
    [code:1:e17db73de7]
    public function pingCURL($link)
    {
    // start the cURL
    $ch = curl_init();
    // set cURL options
    curl_setopt($ch, 'CURLOPT_URL', $link);
    curl_setopt($ch, 'CURLOPT_RETURNTRANSFER', 1);
    curl_setopt($ch, 'CURLOPT_HEADER', 1);
    curl_setopt($ch, 'CURLOPT_NOBODY', 1);
    // execute the cURL
    $info = curl_exec($ch);
    print curl_error($ch); // debugging
    // close the resource
    curl_close($ch);
    }
    [/code:1:e17db73de7]

    Maar dan krijg ik niks terug? Als ik CURLOPT_RETURNTRANSFER op 0 zet, dan krijg ik álle favorieten in één browservenster! :o Dat was niet helemaal de bedoeling! :oops:

    Maar goed, ik vermoed dat ik dus de headers moet ophalen met CURLOPT_HEADER en dan kijken of deze "200 ok" is (met preg_match)? Of kan ik beter ook de body ophalen en dan naar de title kijken? Zo ja, hoe doe ik dat dan zonder de output naar het scherm te printen?
  • [quote:b3ff3d8814="psychonetics"]Oke, ik heb nu dit:
    [code:1:b3ff3d8814]
    public function pingCURL($link)
    {
    // start the cURL
    $ch = curl_init();
    // set cURL options
    curl_setopt($ch, 'CURLOPT_URL', $link);
    curl_setopt($ch, 'CURLOPT_RETURNTRANSFER', 1);
    curl_setopt($ch, 'CURLOPT_HEADER', 1);
    curl_setopt($ch, 'CURLOPT_NOBODY', 1);
    // execute the cURL
    $info = curl_exec($ch);
    print curl_error($ch); // debugging
    // close the resource
    curl_close($ch);
    }
    [/code:1:b3ff3d8814]

    Maar dan krijg ik niks terug? Als ik CURLOPT_RETURNTRANSFER op 0 zet, dan krijg ik álle favorieten in één browservenster! :o Dat was niet helemaal de bedoeling! :oops:

    Maar goed, ik vermoed dat ik dus de headers moet ophalen met CURLOPT_HEADER en dan kijken of deze "200 ok" is (met preg_match)? Of kan ik beter ook de body ophalen en dan naar de title kijken? Zo ja, hoe doe ik dat dan zonder de output naar het scherm te printen?[/quote:b3ff3d8814]
    Als ik naar een voorbeeld kijk, dan heb je de constanten als string gedefinieerd.
    [code:1:b3ff3d8814]
    TO GET A PAGE USING A URL ONLY:

    <?php
    $url="http://anything";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    $store = curl_exec ($ch);
    $xml = curl_exec ($ch);
    curl_close ($ch);

    ?>[/code:1:b3ff3d8814]

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.