4.1 Länkar
Ett problem med länkar är att det är lite jobbigt att
hålla reda på dessa. Funkar de, eller är de döda?
Detta kan man avhjälpa med följande lilla program. Det används
genom att sätta in det som src för en img tagg.
Genom att sätta den som img så får vi dessutom den
fördelen att sidans text laddas snabbt medan bilderna kommer efteråt.
Sidan sker således asynkront. Först sätts länkarna
ut och sedan visas en bild som säger om länken funkar eller
inte.
Exempelanvändning
<html> <head> <title>Links</title> </head> <body> <img src="./inc/check_link.php?url=http://www.badadress.comm/"> <a href="http://www.badadress.comm/"> http://www.badadress.comm/ </a> <br /><br /> <img src="./inc/check_link.php?url=http://www.microsoft.com/"> <a href="http://www.microsoft.com/"> http://www.microsoft.com/ </a> <br /><br /> <img src="./inc/check_link.php?url=http://www.microsoft.com/feel.html"> <a href="http://www.microsoft.com/feel.html"> http://www.microsoft.com/feel.html </a> </body> </html>
Listning 4.1.1 - samples/testa.htm
Resultat av listning 4.1.1 Koden för länkkontrollen:
<?php
# OBS! sätt alltid / i slutet av URL om det inte anges ett filnamn
# om sidan är nyare än 7 dagar
$dagar = 7;
# måste räkna om till sekunder
$sekunder = $dagar * 60 * 60 * 24;
# se till att ni har fyra bilder och sätt
# korrekt path till dem. De skall vara
# lika stora och av typen jpeg, gif eller png
# de fyra bilderna behöver inte vara av samma typ
# bild för död server
$bilder[ 0 ] = "../images/dead.gif";
# bild för sida som inte finns
$bilder[ 1 ] = "../images/sad.gif";
# bild för allt ok
$bilder[ 2 ] = "../images/happy.gif";
# bild för allt ok och sida nyligen uppdaterad
$bilder[ 3 ] = "../images/happy_new.gif";
# ändra $_GET till $HTTP_GET_VARS om du har PHP 4.0.6
$url = $_GET[ "url" ] ;
# sök fram server och filnamnsdelen
preg_match( "/http:\/\/([^\/]*)\/(.*)/i", $url, $matches );
# kontakta servern
$timenow = time();
$datum = $timenow;
$vilkenbild = kontaktaServern( $matches, $datum );
# om php eller asp sidor inte sätter Last-modified så kan man
# egentligen inte kolla när de ändrats
if ( $vilkenbild == 2
&& $datum != $timenow
&& $datum + $sekunder >= $timenow )
$vilkenbild = 3;
# vi måste sätta rätt header innan vi sätter ut bildens data
$image_info = getimagesize( $bilder[ $vilkenbild ] );
switch( $image_info[ 2 ] )
{
case 1: # gif
Header( "Content-type: image/gif" );
break;
case 2: # jpeg
Header( "Content-type: image/jpeg" );
break;
case 3: # png
Header( "Content-type: image/x-png" );
break;
}
# öppna rätt bild som binary
$filen = fopen ( realpath( $bilder[ $vilkenbild ] ), "rb" );
# sänd allt till browsern
fpassthru( $filen );
# stäng filen
fclose( $filen );
# funktion för länkkontroll
# returnerar:
# 0 för död server
# 1 för sidan finns inte
# 2 för allt ok
function kontaktaServern( $data, &$datum )
{
$server = $data[ 1 ];
$file = "/" . @ $data[ 2 ];
$fp = @fsockopen (
$server,
80,
$errno,
$errstr,
10 # timeout efter 10 sekunder - ändra vid behov
);
if ( ! $fp )
{
# servern svarade inte
return 0;
}
else
{
# det räcker med att kolla HEAD
# resten av sidan är ointressant
$command = "HEAD $file ";
$command .= "HTTP/1.0\r\n";
$command .= "Host: $server\r\n\r\n";
fputs ( $fp, $command );
$row = fgets ( $fp, 4096 );
# kontrollerar bara 200
# man skulle även kunna kolla 301 och 302
# för att se om sidan flyttats
if ( ! ( strpos ( $row, "200" ) > 0 ) )
{
fclose ( $fp );
# sidan fanns inte
return 1;
}
while ( trim( $row ) != "" AND ( !feof( $fp ) ) )
{
$row = fgets ( $fp, 4096 );
if (strpos ( $row, ":" ) > 0 )
{
list( $header, $content ) = explode ( ":", $row );
if ( strcasecmp( trim( $header ), "Last-Modified" ) == 0 )
$datum = strtotime( $content ) ;
}
}
fclose ( $fp );
# allt ok
return 2;
}
}
?>
Listning 4.1.2 - inc/check_link.php Last-modified
Last-modified sätts inte alltid om man har asp eller php sidor. Vill du
vara säker på att cache mm. hanteras rätt kan du sätta
följande i början av ditt php program för att se till att
Last-modified sätts till filens datum:
<?php Header( "Last-Modified: " . gmdate ("D, d M Y H", getlastmod () ) );?>
|