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

Sidans tema: fopen, file, fsockopen, HTTP protokollet

 

Skulle det inte vara bra om man kunde kolla om sidorna finns kvar och när de ändrats om de finns kvar? OK, lets do it!

Skapa en fil med namet checklinks.php

Sätt den i samma katalog som de övriga och sätt in följande:

<?php
    
function kollaLänkarna $filnamn )
    {
        
# öppna filen och sätt allt in i en array
        
$allt file$filnamn  );
        
# filen har redan stängts
        
        # öppna upp filen för skrivning
        
$fp fopen$filnamn"w+" );

        
# lås filen så att andra kan läsa men inte skriva
        
flock$fp);
        
        
# loopa genom arrayen allt
        
foreach( $allt as $raden )
        {
            list( 
$url$description$rating$title ) = explode "\t"$raden ); 
            
            
# plocka ut servernamn respektive filnamn ur url:n
            # sätt dem in i en array där $matches[1] är servern
            # och $matches[2] är sidan (om någon)
            
preg_match"/http:\/\/([^\/]*)\/(.*)/"$url$matches );
            
            
# skapa en tom header för reslutatet
            
$headerdata = array();
            
            
# kolla om sidan finns 
            # om funktionen returnerar true kommer
            # $headerdata att fyllas med headerns data
            # i annat fall kommer $headerdata["Status"] att
            # innehålla orsaken till felet
            
if ( kontaktaServern$matches ,$headerdata ) ) 
            {
                
# skapa en tabseparerad rad
                
$nyrad =  $url "\t"
                
$nyrad .= $description"\t";
                
$nyrad .= $rating "\t";
                
$nyrad .= trim($title) . "\t";
                
$nyrad .= $headerdata["Date"] ."\r\n" ;
            }
            else
            {    
                
# skapa en tabseparerad rad
                
$nyrad $url "\t"
                
$nyrad .= $description"\t";
                
$nyrad .= $rating "\t";
                
$nyrad .= trim($title) . "\t";
                
$nyrad .= $headerdata["Status"] . "\r\n";
            }
            
# skriv den tabseparerade raden till links.txt
            
fputs$fp$nyrad );
        }
        
        
# tag bort fillåsningen
        
flock$fp);
        
        
# stäng filen
        
fclose$fp );
        
    }
    
    
# funktion som kollar om en server är vid liv och om sidan
    # finns
    # första parametern är en array med servernamnen 
    # och file (inklusive path)
    # andra är en *referens* till en array som kommer att användas för 
    # resultat-rapportering
    
function kontaktaServern$data , &$resultat )
    {
        
$server $data[1];
        
# det finns kanske inte alltid ett andra element
        # i arrayen - därav @
        
$file  "/" . @ $data[2];

        
# prova öppna porten
        
$fp fsockopen 
                        
$server,    # adressen - ip går också 
                        
80,            # port. 80 = HTTP 
                        
$errno,        # för eventuella felnummer 
                        
$errstr,    # eventuella felmeddelanden 
                        
20            # timeout tid innan vi skall ge upp 
                        
); 

        
# gick det inte att öppna ? 
        
if ( !$fp )  
        { 
            
# Sätt felmeddelande om inte det gick 
            
$resultat["Status"] = "Servern död";
            
# och returnera false
            
return false
        }  
        else  
        { 
            
# skapa ett normalt HTTP GET kommando 
            # observera att en den alltid måste sluta 
            # med \r\n\r\n (två CRLF)

            
$command "GET $file "
            
$command .= "HTTP/1.0\r\n"
            
$command .= "Host: $server\r\n\r\n"
        
            
# sänd detta 
            
fputs $fp$command ); 
                 
            
# läs första raden
            
$row  fgets $fp4096 ); 

            
# ett normalt status medelande innehåller alltid 200
            # alla andra nummer visar på fel - t.ex att sidan inte finns
            # Vanliga meddelandenummer
            #        200 - OK
            #        301 - Moved Permanently
            #        302 - Moved Temporarily
            #        400 - Bad Request
            #        401 - Unauthorized
            #        402 - Forbidden
            #        404 - Not found
            #        500 - Internal server error
            
            
if ( ! ( strpos $row"200" ) > ) )
            {
                
$resultat["Status"] = "Sidan finns inte";
                return 
false
            }

            
# läs vidare tills headern är slut
            
while ( trim$row ) != "" AND ( !feof$fp ) ) )
            {
                
$row  fgets $fp4096 ); 

                
# tag bort nedanstående kommentarstecken # om du vill 
                # se vad som egentligen händer.
                # echo "$row <br />";

                # Headern från min server innehåller bland annat
                # Server: Microsoft-IIS/5.0 
                # Date: Thu, 28 Feb 2002 14:52:40 GMT 
                # Connection: Keep-Alive 
                # Content-Length: 10168 
                # Content-Type: text/html 
                
                # observera att det alltid är ett kolon i raden

                
if (strpos $row":") > )
                {
                    
# plocka ut det före kolon och det efter kolon
                    
list( $header$content ) = explode ":"$row ); 
                    
                    
# kolla om det var date
                    # konvertera från GMT datum til en dateserial
                    
if ( strcasecmptrim$header ), "Date" ) == )
                        
$content strtotime$content ) ;
                    
# sätt in detta i resultat arrayen
                    
$resultattrim$header ) ] = trim $content );
                }
            }
    
            
# stäng porten 
            
fclose $fp ); 
            
            
# kom vi ända hit måste väl allt vara ok
            
return true;
        }
    }
?>
Listning - samples/checklinks.php

Resultat av listning

Ändra lite i o1code.php

<?php

    
    
# funktion som sorterar arrayen
    # observera & tecknet som gör att 
    # arrayen sänds med referens
    # och modifieras "in-place"
    
function minSortering( &$arrayen )
    {    
        
# Kolla om det fanns en sortering i adressraden
        
global $HTTP_GET_VARS;
        if ( isset ( 
$HTTP_GET_VARS["SORT"] ) )
        {
            
$sorteringsNyckel $HTTP_GET_VARS["SORT"];
        }
        else
        {
                
# default sortering är enligt url
                
$sorteringsNyckel "url" ;
        }
        
# sortera enligt angiven nyckel
        # det vi i praktiken sände via URL var vilken
        # funktion vi skulle använda för sortering
        
uasort$arrayen$sorteringsNyckel );
    }

    
# funktion som sorterar enligt url
    
function url$left$right )
    {
            
$leftArray explode "\t"$left );
            
$rightArray explode "\t"$right );
            return 
strcasecmp$leftArray[0], $rightArray[0] );
    }
    
    
# funktion som sorterar enligt description
    
function description$left$right )
    {
            
$leftArray explode "\t"$left );
            
$rightArray explode "\t"$right );
            return 
strcasecmp$leftArray[1], $rightArray[1] );
    }
    
    
# funktion som sorterar enligt rating
    
function rating$left$right )
    {
            
$leftArray explode "\t"$left );
            
$rightArray explode "\t"$right );
            return 
strcasecmp$leftArray[2], $rightArray[2] );
    }

    
# funktion som sorterar enligt title
    
function title$left$right )
    {
            
$leftArray explode "\t"$left );
            
$rightArray explode "\t"$right );
            return 
strcasecmp$leftArray[3], $rightArray[3] );
    }


    
# en funktion som visar innehållet i 
    # länklistan
    # parameter: namnet på filen
    
function visaLänkarna $filnamn )
    {
        global 
$HTTP_SERVER_VARS;
        
$filen $HTTP_SERVER_VARS["PHP_SELF"];
        
        
# öppna filen och sätt allt in i en array
        
$allt file$filnamn  );


        
minSortering$allt );
        
        
# vi skall returnera en komplett HTML-tabell
        
$result "<table border=\"1\">";    
        
        
$result .= "<tr>";
        
$result .= "<td><a href=\"$filen?SORT=url\">URL</a></td>";
        
$result .= "<td><a href=\"$filen?SORT=description\">Förklaring</a></td>";
        
$result .= "<td><a href=\"$filen?SORT=rating\">Betyg</a></td>";
        
$result .= "<td><a href=\"$filen?SORT=title\">Titel</a></td>";
        
$result .= "</tr>";

        
# loopa genom arrayen allt
        # raden kommer att vara en rad i filen
        
foreach( $allt as $raden )
        {
            
# plocka ut ut de enskilda fälten
            # explode skapar en array och 
            # list skapar enskilda variabler av arrayen
            
            # ÄNDRAD ---------------------------------------------
            
list($url$description$rating$title$status ) = explode "\t"$raden ); 
            
# SLUT PÅ ÄNDRAD -------------------------------------
            
            # NY -------------------------------------------------
            
if ( intval $status ) != )
            {
                
$status "Senast ändrad : " date("d.m.Y"trim$status )  );
            }
            
# SLUT PÅ NY ----------------------------------------

            # plocka ihop såval tabellen men också "a href"
            
$result .= "<tr><td><a href=\"$url\">$url</a></td>";
            
$result .= "<td>$description</td>";
            
$result .= "<td>$rating</td>";
            
$result .= "<td>$title</td></tr>";
            
            
# NY -------------------------------------------------
            
$result .= "<tr><td colspan=\"4\">$status</td></tr>";
            
# SLUT PÅ NY ----------------------------------------
        
}

        
# avsluta tabellen
        
$result .= "</table>";

        
# returnera den genererade tabellen
        
return $result;
    }
?>
Listning - samples/o2code1.php

Resultat av listning

Ändra lite i links.php

<?php
    
    
# NY -------------------------------------------------
    
include_once( dirname __FILE__ ) . "/checklinks.php" );
    
# SLUT PÅ NY -----------------------------------------

    # du skall fortfarande inkludera o1code.php
    
include_once( dirname __FILE__ ) . "/o2code1.php" );
    
$länkFilen dirname __FILE__ ) . "/links.txt" ;
?>
<html>
<head>
<title>Mina länkar</title>
<meta    http-equiv="Content-Type" 
        content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">

<?php
    
    
# NY -------------------------------------------------
    
kollaLänkarna ($länkFilen );
    
# SLUT PÅ NY -----------------------------------------

    
echo visaLänkarna$länkFilen );
    
?>

</body>
</html>
Listning - samples/o2_1.php

Resultat av listning