några sidor på nätet om PHP programmering

Sök efter  
Börja här Uppgifter Testa dig själv Tips Sidokarta mm. Länkar Sök

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 () ) );?>

   TipsLänkar