|
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, 1 );
# 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, 3 );
# 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 ( $fp, 4096 );
# 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" ) > 0 ) )
{
$resultat["Status"] = "Sidan finns inte";
return false;
}
# läs vidare tills headern är slut
while ( trim( $row ) != "" AND ( !feof( $fp ) ) )
{
$row = fgets ( $fp, 4096 );
# 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, ":") > 0 )
{
# 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 ( strcasecmp( trim( $header ), "Date" ) == 0 )
$content = strtotime( $content ) ;
# sätt in detta i resultat arrayen
$resultat[ trim( $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 ) != 0 )
{
$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
|