Heute möchte ich euch in diesem Tutorial vorstellen, wie man mit der PHP Funktion fsockopen() Daten von einer externen Webseite abfragt. Häufig benötigt man diese Funktion, um zum Beispiel ein RSS Feed oder eine gesamte Webseite einzulesen. Natürlich könnte man auch eine einfache Textdatei einlesen, es ist eigentlich alles möglich mit dieser PHP-Funktion von einen externen Host abzufragen. In diesem Tutorial möchte ich zusätzlich darauf eingehen, wie man sogar den aktuellen Seitenheader ausgeben kann. Hierzu gestalte ich eine Selbstdefinierte Php Function, die automatisch entscheiden kann ob der aktuelle Seitenheader oder der HTML Code von der Webseite ausgelesen werden soll.
Um die PHP Funktion fsockopen() zu verwenden, nutze ich wie bereits erwähnt, eine selbstdefinierte Php Function. Diese selbstdefinierte Php Function erkläre ich im ersten Beispiel und im zweiten Abschnitt gehe ich darauf ein, wie man diese Php Function verwenden kann. Für die Leute, die noch nicht wissen was eine selbstdefinierte Php Function ist, können hierzu den Artikel: "Php Function" sich vorher durchlesen.
Also kommen wir zu der Php Function:
<?php
/*
* Created on 10.01.2010 by Nico Schubert
*/
function daten_von_host_abfrage($url,
$rueckgabe_art = 1, $timeout = 30) {
/**
* Als erstes prüfen wir in der Funktion, ob
die Variable $url übergeben wurde, wenn
dies nicht der Fall ist brechen wir die
Funktion mit return() ab und geben eine
Fehlermeldung zurück.
*/
if ($url == '') {
return ('Die Variable $url wurde nicht
übergeben bei der Funktion
daten_von_host_abfrage().');
}
/**
* Nun zerlegen wir die Variable $url mit der
PHP Funktion parse_url() in ihre
Bestandteile und speichern das
zurückgegebene Array in der Variable
$url_bestandteile. Wir stellen vor die
PHP Funktion parse_url() ein @ Zeichen,
damit bei einen Fehler, dieser nicht
ausgegeben wird.
*/
$url_bestandteile = @parse_url($url);
/**
* Sollte in der Variable $url_bestandteile ein
false übergeben wurden, brechen wir die
Funktion ab und geben mit return eine
Fehlermeldung zurück.
*/
if ($url_bestandteile == false) {
return ('In der Variable $url, ist keine
gültige Internetadresse übergeben
wurden.');
}
/**
* Nun prüfen wir mit der PHP Funktion isset()
in Verbindung einer IF Anweisung, ob in
der Variable $url_bestandteile bei den
Array, der Schlüssel "host" mit ein
Inhalt hinterlegt ist. Wenn dies nicht
der Fall ist, geben wir mit return eine
Fehlermeldung zurück. Sollte dieser
Schlüssel mit einen Inhalt vorhanden
sein, speichern wir im else Weg von der
IF Anweisung, den Inhalt in der Variable
$host.
*/
if (!isset($url_bestandteile['host']))
return ('In der Variable $url konnte kein
gültiger Host ermittelt werden!');
else
$host = $url_bestandteile['host'];
/**
* Jetzt prüfen wir genauso wie beim "host",
den aktuellen "path" und speichern diesen
anschließend in der Variable $path
*/
if (!isset($url_bestandteile['path']))
return ('In der Variable $url konnte kein
gültiger Path ermittelt werden!');
else
$path = $url_bestandteile['path'];
/**
* Zu guter letzt müssen wir genauso noch in
der Variable $url_bestandteile das
"scheme" überprüfen und anschließend
wieder in der Variable $scheme speichern.
*/
if (!isset($url_bestandteile['scheme']))
return ('In der Variable $url konnte kein
gültiges Scheme ermittelt werden!');
else
$scheme = $url_bestandteile['scheme'];
/**
* Als nächsten Schritt müssen wir überprüfen
mit einer switch() Anweisung, ob in der
Variable $scheme "https" oder "http" steht.
*/
switch ($scheme) {
case 'https':
/**
* Wenn in der Variable $scheme "https"
steht, definieren wir in der Variable
$out unseren Aufruf, dass dieser per
GET und verschlüsselt werden soll.
*/
$out = "GET ".$path." HTTPS/1.1
";
/**
* Da wir unserer Abfrage verschlüsselt
versenden möchten, müssen wir vor
unseren $host ein entsprechendes
"ssl://" anhängen.
*/
$host = "ssl://".$host;
/**
* Zusätzlich müssen wir in der Variable
$port den aktuellen Port für eine SSL
Verbindung speichern. Auf diesen Port
stellen wir unserer Anfrage.
*/
$port = 443;
break;
case 'http':
/**
* In diesem Abschnitt definieren wir den
Port auf 80 in der Variable $portund
bereiten die Übergabe unserer Anfrage
mit GET vor. Dazu speichern wir
unsere Anfrage in der Variable $out.
*/
$port = 80;
$out = "GET ".$path." HTTP/1.1
";
break;
default:
/**
* Sollte ein nicht definiert Scheme
gefunden werden in der Variable
$scheme, brechen die Funktion ab und
geben mit return() eine Fehlermeldung
zurück.
*/
return ('Der übergebene Scheme
('.$scheme.') bei der Variable $url,
wird in der PHP Funktion
daten_von_host_abfrage() nicht
unterstützt. ');
break;
}
/**
* Nachdem wir nun alle Variablen überprüft
haben, können wir unsere
Socket-Verbindung mit der PHP Funktion
fsockopen() zu den Host, den wir in der
Variable $host gespeichert haben
aufbauen. Wir schreiben hier bei vor die
PHP Funktion fsockopen() ein @ Zeichen,
damit eine eventuelle PHP Fehlermeldung
nicht ausgegeben wird. Es wird von der
PHP Funktion fsockopen() ein Zeiger auf
die Datei zurückgegeben. Diesen Zeiger
kann man mit der PHP Funktion fwrite()
weiterverarbeiten. In unserem Beispiel
legen wir den Zeiger in der Variable $fp ab.
*/
$fp = @fsockopen($host, $port, $errno,
$errstr, $timeout);
/**
* Jetzt definieren wir die Variable
$daten_rueckgabe, in dieser Variable
speichern wir anschließend unserer
Rückgabe, die der Host zurückgibt.
*/
$daten_rueckgabe = '';
/**
* Sollte keine Verbindung aufgebaut werden
können mit der PHP Funktion fsockopen()
gibt diese ein False zurück, dies werden
wir an dieser Stelle mit einer IF
Anweisung aus und brechen gegebenenfalls
mit return() unseren Funktionslauf ab.
*/
if (!$fp) {
return ($errstr ."(".$errno.")<br />n");
} else {
/**
* Wenn wir nun einen aktuellen Dateizeiger
haben in der Variable $fp, können wir
unsere Anfrage die wir über die
Variable $out stellen, mit Host und
Connection: Close erweitern.
*/
$out .= "Host: $host
";
$out .= "Connection: Close
";
/**
* Jetzt senden wir unserer aktuelle
Abfrage an den Host.
*/
fwrite($fp, $out);
/**
* Nun führen wir eine while() Schleife
aus, bis der aktuelle Dateizeiger am
Ende ist.
*/
while (!feof($fp)) {
/**
* Mit der PHP Funktion fgets()
speichern wir jede einzelne
Rückgabezeile in der Variable
$daten_rueckgabe.
*/
$daten_rueckgabe .= fgets($fp, 128);
}
/**
* Zu guter letzt schließen wir die
geöffnete Verbindung mit der PHP
Funktion fclose().
*/
fclose($fp);
}
/**
* Da wir nun in der Variable $daten_rueckgabe
die gesamte Rückgabe vom Host gespeichert
haben, müssen wir den Header von der
Webseite trennen. Dieser ist aktuell mit
zwei Zeilenumbrüchen getrennt. Hierzu
nutzen wir die PHP Funktion explode() und
list().
*/
list($header, $html) = explode("
",
$daten_rueckgabe);
/**
* Nun prüfen wir als letztes den übergebenen
Parameter, den wir in der Variable
$rueckgabe_art gespeichert haben, ob
dieser "1" oder ein anderer ist. Wenn
dieser "1" ist geben wir den Header aus,
ansonsten geben wir den HTML Code der
Rückengegebenen Webseite mit der PHP
Funktion return() zurück.
*/
if ($rueckgabe_art == 1)
return($header);
else
return($html);
}
?>
So nun sind wir mit unserer selbst definierten Php Function fertig. Als nächstes erkläre ich ihnen, wie sie mit der definierten Function eine Webseite ausgeben.
Beispiel für den Aufruf, der Function:
<?php
/*
* Created on 10.01.2010 by Nico Schubert
*/
/**
* Wenn wir nun die Funktion aufrufen möchten,
müssen wir dieser Funktion einen gültigen URL
übermitteln. Als erstes definieren wir die
Variable $url, in dieser Variable speichern
wir unsere URL, wo wir unsere Anfrage stellen
möchten.
*/
$url = 'http://www.schubertmedia.de/index.php';
/**
* In der Variable $art geben wir an, ob die
Funktion den aktuellen Seitenheader oder die
Webseite zurückgeben werden soll. Die
Funktion liefert bei "1" den Seitenheader und
bei "2" den Sourcecode von der Webseite.
*/
$art = 1;
/**
* Zusätzlich definieren wir in der Variable
$timeout, wie lang der Server warten soll auf
eine Antwort, bis die aktuelle Anfrage
abgebrochen wird.
*/
$timeout = 10;
/**
* So nun als letztes müssen wir die Funktion, die
wir bereits im oberen Bereich erklärt haben
noch aufrufen mit unseren definierten
Parametern und geben diese anschließend den
Rückgabewert mit echo aus.
*/
echo daten_von_host_abfrage($url, $art, $timeout);
?>
Jetzt sind wir fertig. :) Ich Wünsche euch viel Spaß mit dieser PHP Function und treibt damit bitte kein Unfug! Wenn Ihr noch Fragen zu dieser PHP Function habt, so nutzt bitte unser Supportforum. Nun zu guter letzt, alle PHP-Funktionen wofür wir bereits verschiedene Tutorials geschrieben haben.
echo - Erklärung wie man mit der PHP Funktion echo einen Text in PHP ausgeben kann.
PHP Function - Hier wird erklärt, wie sie eine selbstdefinierte PHP Function erstellen.
IF Anweisung - Einführung in die IF Anweisung unter PHP.
isset() - Prüfen einer Variable, ob diese definiert ist.
parse_url() - Eine Adresse in ihre Bestandteile zerlegen.
explode() - Eine Zeichenkette mit einen definierten Trennzeichen aufsplitten.