[PHP] links op website checken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Goeiedag mensen,

Om te beginnen:

Ik heb 24606 links op mijn pagina. Om ervoor te zorgen dat het up-to-date blijft wil ik een file (vanuit admin) om the checken welke pagina is weg kan knikkeren. Of te wel welke pagina een 404 oid geven.

Al deze links haal ik uit een database.

Weet iemand hoe ik dit het beste kan doen?

Ik heb al wat programmaatjes gedownload, maar die werken niet.

Volgens mij kan ik daar wel een functie ofzo voor schrijven, maar heb geen idee waar/hoe ik moet beginnen.

Please help!

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Waar heb je die links? In een database o.i.d.? Je kan in ieders geval met fopen iedere link openen en kijken of je een 404 header terug krijgt of een pagina. In het geval van een pagina zou je kunnen kijken of er wel 404 op voor komt.

Acties:
  • 0 Henk 'm!

  • MRic3
  • Registratie: Januari 2001
  • Laatst online: 01-09 11:52

MRic3

Of praat ik weer poep?

kan mij herinneren dat er zo'n website was die dat deed checken...
website mechanic ofzo.. die controleerde eigenlijk je HTML code
maar gaf ook meteen terug welke links het niet deden....

If the world didn't suck, we would all fall off!!!


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Url openen met sockets, en dan de header met status uitlezen he. Als die header 404 geeft weet je genoeg. :)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
djluc schreef op 10 september 2004 @ 17:50:
Waar heb je die links? In een database o.i.d.? Je kan in ieders geval met fopen iedere link openen en kijken of je een 404 header terug krijgt of een pagina. In het geval van een pagina zou je kunnen kijken of er wel 404 op voor komt.
Alle links staan in een database.
Die links staan ook op verschillende pagina's, maar das geen probleem.

Ik wil dus bijvoorbeeld een checklink.php maken en dan hetzelfde alle links uitlezen en dan een extra echo er achteraan geven (wat dus niet op de pagina staan) en dan bijv achter de link zetten wat ie terug geeft.

Dus iets van:

function checklink($url)
{
maak connectie met database
haal link uit database
check de link op error
if ($link == 404)
{
echo "$url is dead";
}
else
{
echo "$url";
}

}


checklink("url_naar_link.php");


ff globaal gezien dan

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
SELECT alle links
while(){
$file=@file_get_contents(url);
if(!$file OR !check de headers()){
//link kapot
}
}

Acties:
  • 0 Henk 'm!

Verwijderd

djluc schreef op 10 september 2004 @ 18:52:
SELECT alle links
while(){
$file=@file_get_contents(url);
if(!$file OR !check de headers()){
//link kapot
}
}
dit lijkt me niet de beste oplossing... je haalt namelijk de hele pagina op wat niet echt nodig is.
je kan beste socket openen naar webserver en dan een HEAD sturen of meteen na de header connectie dicht gooien :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function checklink($url)
{
   $info=parse_url($url);
   $fp=fsockopen($info["host"],80);
    if (!$fp) return false;
    fputs($fp,"HEAD ".$info["path"]." HTTP/1.0\r\n");
    fputs($fp,"Host: ".$info["host"]."\r\n\r\n");
    $row=fgets($fp,4096);
    fclose($fp);
    if (!preg_match("#HTTP/1.[01] ([0-9]+)#",$row,$match))
       return false;
    return ($match[1] == 200);
}

[ Voor 39% gewijzigd door Verwijderd op 10-09-2004 19:16 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
je haalt namelijk de hele pagina op wat niet echt nodig is.
Voor de zekerheid wel want vaak krijg je niet netjes een 404 header terug maar wordt er een pagina met zoekresultaten o.i.d. getoont. Je zou de pagina dus op teksten als page not found e.d. moeten checken.

Acties:
  • 0 Henk 'm!

Verwijderd

djluc schreef op 10 september 2004 @ 20:19:
[...]
Voor de zekerheid wel want vaak krijg je niet netjes een 404 header terug maar wordt er een pagina met zoekresultaten o.i.d. getoont. Je zou de pagina dus op teksten als page not found e.d. moeten checken.
Vaak hebben ook die pagina's een 404 header :)
omdat die 'zoek' pagina, door apache(of andere http server) als 404 pagina gepresenteerd word.
Mits dat de constructie, wat vaak zo is.
(gezien dat de simpelste manier is enzo)

[ Voor 16% gewijzigd door Verwijderd op 10-09-2004 20:39 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bedankt alvast ik ga morgen ff testen of het werkt (ben nu redelijk gaar)
Het is in iedergeval zeker een goed begin!

:) :) :)

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Let wel op eventuele redirects zoals een 301 of 307 header ;)

[ Voor 7% gewijzigd door Erkens op 10-09-2004 23:06 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Eigenlijk is elke header groter of gelijk aan 400 al een probleem. 401 staat voor dingen die authorisatie nodig hebben, lijkt me niet wenselijk bij een link in een linksverzameling. 403 is not allowed, dus daar kom je ook niet in. 404 weet je al, en 500 lijkt me ook duidelijk.
Ik zou de records trouwens alleen in het geval van een 404 fysiek uit de database verwijderen, in het geval van die andere headers kun je beter de gegevens flaggen en in de DB laten staan, zodat je later nog eens kan checken of het dan wel werkt. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function checklink($url)
{
   $info=parse_url($url);
   $fp=fsockopen($info["host"],80);
    if (!$fp) return false;
    fputs($fp,"HEAD ".$info["path"]." HTTP/1.0\r\n");
    fputs($fp,"Host: ".$info["host"]."\r\n\r\n");
    $row=fgets($fp,4096);
    fclose($fp);
    if (!preg_match("#HTTP/1.[01] ([0-9]+)#",$row,$match))
       return false;
    return ($match[1] == 200);
}
Ik heb dit getest, maar dit duurt echt niet nomaal lang als ik bijvoorbeeld 100 links open, en wanneer hij een fout geeft dat ie dan de errorcode erachter zet, dan ben ik 20 minuten bezig ofo. Het werkt wel, maar is er geen snellere optie??

Acties:
  • 0 Henk 'm!

  • pachacuti
  • Registratie: Januari 2002
  • Laatst online: 14-09 12:40
kan je misschien niks doen met de Link validator van het W3C?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
pachacuti schreef op 12 september 2004 @ 11:37:
kan je misschien niks doen met de [url=]Link validator[/url] van het W3C?
Die werkt niet best, omdat mijn links uit een database komen en hij checked dan de connectie naar mySQL en hij vern**kt mijn stats. Elke keer als hij een link opent, dan heb ik een klik erbij.

[ Voor 7% gewijzigd door Verwijderd op 12-09-2004 11:43 ]


Acties:
  • 0 Henk 'm!

  • Kuhlie
  • Registratie: December 2002
  • Niet online
Verwijderd schreef op 12 september 2004 @ 11:31:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
function checklink($url) 
{ 
   $info=parse_url($url); 
   $fp=fsockopen($info["host"],80); 
    if (!$fp) return false; 
    fputs($fp,"HEAD ".$info["path"]." HTTP/1.0\r\n"); 
    fputs($fp,"Host: ".$info["host"]."\r\n\r\n"); 
    $row=fgets($fp,4096); 
    fclose($fp); 
    if (!preg_match("#HTTP/1.[01] ([0-9]+)#",$row,$match)) 
       return false; 
    return ($match[1] == 200); 
}
?> 


Ik heb dit getest, maar dit duurt echt niet nomaal lang als ik bijvoorbeeld 100 links open, en wanneer hij een fout geeft dat ie dan de errorcode erachter zet, dan ben ik 20 minuten bezig ofo. Het werkt wel, maar is er geen snellere optie??
Als je nog een header "Connection: close\r\n" toevoegt zal het waarschijnlijk wat sneller gaan. Doe je dat niet dan zou er wel eens een keep-alive-connectie kunnen worden geopend, waarbij de verbinding pas na bijv. 20 seconden wordt gesloten.

Je kunt misschien ook de socket-time-out wat lager zetten voor bijv. servers die niet reageren.

Acties:
  • 0 Henk 'm!

  • MRic3
  • Registratie: Januari 2001
  • Laatst online: 01-09 11:52

MRic3

Of praat ik weer poep?

mss is dit wat Dikke Zuiper???

If the world didn't suck, we would all fall off!!!


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 12 september 2004 @ 11:31:
Ik heb dit getest, maar dit duurt echt niet nomaal lang als ik bijvoorbeeld 100 links open, en wanneer hij een fout geeft dat ie dan de errorcode erachter zet, dan ben ik 20 minuten bezig ofo. Het werkt wel, maar is er geen snellere optie??
Verbindingen opzetten naar 20.000 sites gaat nou eenmaal niet in een paar seconden. :) Zoals de mensen boven me al zeggen kun je wel wat tijd winnen door wat aan de time-outs te doen, en door de verbinding tijdig te sluiten, maar uiteindelijk zal je script niet bepaald in een minuutje klaar zijn.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1