Toon posts:

[php] Links checken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ok, even een vraagje:
Ik ben bezig met een scriptje dat een behoorlijk aantal pagina's in de gaten moet gaan houden, of ze in elk geval op commando kan checken.
Voor een enkele pagina, of een klein aantal, valt dit gewoon te doen met fopen(); Echter, als ik 800 (of meer) pagina's (en hun inhoud) op deze wijze in de gaten wil houden, zal een script dat dit doet al snel tegen een time-out aanlopen, of er in elk geval onnoemelijk lang over doen.

Nu zat ik zelf aan twee oplossingen te denken:
Ten eerste, een time-out te zetten op het openen van de pagina's. Dus als er een niet opent, ontzettend langzaam is of wat dan ook van dien aard, dat er dan gewoon een flag gezet wordt voor die pagina. Ik zou echter niet weten hoe dit zou moeten...
De tweede oplossing zou een soort bot zijn, die gewoon automatisch en vrijwel constant in de weer is. Ik vraag me alleen af of dat wel mogelijk is in php.

Is er iemand die hier een oplossing voor weet?

Met vriendelijke groet,
Thomas

Verwijderd

je zou met sockets op port 80 kunnen connecten en dan een HTTP request sturen, als je een 404 trug krijgt weet je genoeg ;)
nadeel: php sockets zijn traag :(

Verwijderd

Topicstarter
Ja, dat kan ook met
$var = fopen(url);
Als !$var, dan heb je een 404.

Het probleem zit 'm dus vooral in de snelheid...

Verwijderd

Waar ik laatst achter kwam..... Ik weet niet of het werkt hoor, maar het is maar een idee..

Gebruik een class voor een check

class check {
var $result;
function check ($sitetocheck) {
if fopen ($sitetocheck) $this->result = "goed";
else $this->result = "fout";
}
}

Ongetwijfeld fout gecoded, geen zin in om er iets moois van te maken :) Maar..... Wat mij opviel bij mijn script.. Ik heb een class update.. Als die class aangeroepen wordt, kan de executietijd daarvan LANG duren (omdat het 80MB aan logs doorloopt). In de index.php roep ik 2 keer die class aan, voor 2 verschillende plaatsen van die logs. Maar, wat schetst mijn verbazing? Ze worden TEGELIJKERTIJD uitgevoerd! *D Misschien wel handig?

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Hee, da's mijn class! :P Sorry, verkeerde user gepost.. Kenenrlijk was ie hiero nog ingelogd..

Verwijderd

Topicstarter
Hmmm...van het checken van 800 of meer webpagina's wil ik eigenlijk niet dat dat allemaal tegelijk gebeurt :)

Ik zat te denken, ik zou natuurlijk met een cronjob het script elke 10 minuten er 10 kunnen laten checken. Goed idee of niet, wat betreft serverbelasting en time-out kwesties?

Alvast bedankt voor de reacties :)

Verwijderd

yup, als je elke 10 minuten het script draait, en niet het script eenmaal starten en laten draaien...
iets meer dan 10 kan ook wel hoor, ik denk dat de server het pas echt zwaar gaat krijgen met > 50 per keer...
het is wel de beste manier denk ik...

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Maak je een of ander "timertje" *ahum* dat gewoon 10 classes tegelijk aanmaakt -correct: instantieert-, wacht, bij succes van een link een nieuwe class instantieert, enzovoorts enzoverder. Ik weet niet.. Ben je met een PHP-project bezig, ga je met cron-jobs werken... Is wel vies mi
EaidNtzo |:( (Engelse afkortingen in de Nederlandse taal zijn onzin.. Gebruik mi of whatever ipv IM*O)

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 29-01 20:14

megamuch

Tring Tring!

hmm tsja ik weet niet hoor, maar als je elke X een identieke 404 terug krijgt dan kan je toch iets brouwen a la:

open page,
if not 404 go to next page
else 'schrijf in log foute paginanaam'
(kan geen php)

volgens mij moet dit helemaal niet zwaar zijn en ook makkelijk te checken.. Als je zorgt dat het script continue draait, is dat toch geen probleem (of elk uur)

Bij een timeout zou die pagina dus ook niet je log terecht komen aangezien het geen 404 is..

Verstand van Voip? Ik heb een leuke baan voor je!


  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Wanneer is een page fout?
* 404
* geen connectie met server
* 403?
* * *

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-08 19:18

killercow

eth0

wat ik altijd doe om de load te balancen:
ik maak een pagina deze doet de eerste 10 en stuurt dan na een minuut jouw browser door naar de volgende pagina waarin jij als offset 10 op geeft, daarna 20 , daarna 30
zo loop je dus door al je records heen zonder dat de server het zwaar krijgt, zonder dat je lange execution tijden krijgt en zonder cron jobs,
als jouw inet doen gaat, dan refresh je de browser daarna gewoon en gaat hij gewoon weer verder omdat de offset toch in het url zit.

werkt perfect, gewoon je pc ff aan laten staan.

openkat.nl al gezien?


Verwijderd

Je kan het doen met fsockopen en HEAD requests. Dit geeft alleen de headers terug en scheelt dus een hoop bandbreedte en tijd.

In mijn geval doe ik wel GET's en check ik ook op 302's(redirects) en check meta-refresh tags. Ook hou ik de history bij zodat ik weet dat die links niet ineens naar andere domains gaan e.d..

Dat checken zelf doe ik ongeveer zo:

Elke minuut start ik met cron hetzelfde script en in dit script vang ik af dat hij niet vaker dan 10 x keer draait.

Ik regel dat met statuscodes.
Als een URL bezig is gecheckt te worden staat de status op 1. Als hij klaar is en goedgekeurd zet ik hem op status 2. Indien afgekeurd flikker ik hem weg.

Als eerste doe ik dus een update waarin ik dus de status op 1 ram van het record dat aan de beurt is. In dezelfde update zet ik een timestamp en schrijf een unieke hash weg. Vervolgens doe ik een select op die hash om ervoor te zorgen dat de verschillende versies van het script niet op hetzelfde moment met hetzelfde record aan de slag gaan.

Elke minuut dat het script start kijkt hij dus of er 10 of meer records in status 1 staan. Zo ja, dan kapt ie er gelijk mee.

Om server timeouts af te vangen test ik of er een record al langer dan x minuten in status 1 staat. Zo ja, dan geef ik die een andere status code om hem later nog een kans te geven. Als deze dan weer in een timeout schiet flikker ik hem alsnog weg.

Ook heb ik een maximum gezet voor de te checken URL's per script en een max execution time waarvan ik zeker weet dat hij dit aantal zou moeten halen. Op die manier voorkom je weer dat het script ineens stopt en daardoor het record in een verkeerde status zou kunnen blijven staan.

Klinkt een beetje omslachtig allemaal maar dit is zo'n beetje de enige manier waarop ik in staat ben om de boel de hele dag door URL's te laten checken.

Het geeft trouwens nagenoeg geen load want het merendeel van de tijd zit hij op de response van de remote server te wachten.

  • EgoH
  • Registratie: Oktober 2001
  • Laatst online: 01-09 09:45
ik zou een socket connect maken en dan een request sturen.
Als je code 200 terug krijgt is het ok, anders niet.
PHP:
1
<?$urls[0] = "http://www.nic.st/home.html";foreach($urls as $url){$result = check("$url");echo "$result";}function check($url) {        $surl = ereg_replace("^http://", "", $url);    $host = substr($surl, 0, strpos($surl, "/"));    $path = strstr($surl, "/");    $ReqHeader =      "GET $path HTTP/1.0\n".      "Host: $host\n"."\n";          $socket = fsockopen($host, 80, &amp;$errno, &amp;$errstr);    if(!$socket){      $result="HTTP/1.1 404 Not Found\n";    }    else{    fputs($socket, $ReqHeader);    $result = fgets($socket, 128);}    return $result;}?>

Als hij dus "HTTP/1.1 200 OK" geeft is het goed.

Het script loopt ongeveer 8 seconden om 20 sites te checken.

Verwijderd

Topicstarter
Hoe ik het heb opgelost:
fsockopen, HEAD request, checken of bestandsgrootte hetzelfde is gebleven (is eerder opgeslagen), zo niet, dan gaat ie eruit.

  • wietco
  • Registratie: Augustus 2001
  • Laatst online: 22:09
ff een offtopic vraag (sorry), kan je eigenlijk ook een email addres checken zonder dat de admin een mail krijgt dat hij niet bestaat?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:54
Op dinsdag 18 juni 2002 23:12 schreef wietco het volgende:
ff een offtopic vraag (sorry), kan je eigenlijk ook een email addres checken zonder dat de admin een mail krijgt dat hij niet bestaat?
Als je direct met de SMTP daemon die de mail voor 't adres ontvangt praat wel, volgens mij. De SMTP RFC (in combinatie met de DNS RFC over MX records) kan je daar meer over vertellen.

  • wietco
  • Registratie: Augustus 2001
  • Laatst online: 22:09
ok thx zal ik daar ff onderzoek naar doen :)
Pagina: 1