molily: Datum einer Datei auf einem fremden Server anzeigen lassen

Beitrag lesen

Zu meiner Schande muß ich gestehen, ich weiß nicht wie man einen Socket öffnet und einen HTTP-Request sendet (und was ist HEAD?).
Und wie filtere ich das ganze raus?

Hallo, Conbart.

Ich hatte gerade mit Mühe einen ellenlangen ausschweifenden Text geschrieben, welcher plötzlich verschwunden ist, da ich scheinbar beim Heraussuchen einiger Blätter zu Perl Compatible Regular Expressions die Fluchttaste berührt habe - jetzt habe ich offen gesprochen keinen Nerv mehr, alles aus dem Kopf neu zu entwerfen.
(Deswegen langweile ich dich jetzt nicht mehr mit langen Erklärungen zur Funktionsweise des HTTP-Protokolls und gebe dir gleich ein PHP-Skript an die Hand, welches die Aufgabe lösen dürfte. Du kannst mich ggf. anmailen oder noch einmal fragen, falls du noch speziellere Fragen hast.)

Das Beispiel ist auszugsweise der PHP-Dokumentation entnommen (http://www.php.net/manual/de/) und modifiziert. Dort findest du auch Erklärungen zu den Funktionen fsockopen, fputs, fgets und preg_match, falls das Skript nicht nur nutzen willst, sondern auch wissen möchtest, wie es funktioniert.

Die Variablen $dateipfad sowie $host musst du folgendermaßen anpassen.
Wenn zum Beispiel das PDF-Dokument unter der URL http://www.beispielserver.de/beispielverzeichnis/dokument.pdf verfügbar ist, müssen die Variablendefinitionen $dateipfad="/beispielsverzeichnis/dokument.pdf"; und $host="www.beispielserver.de"; lauten.

--8<--
<?php
$dateipfad="/test.pdf";
$host="molily.dyndns.org";

$timeout=5;
$antwort="";
$request="HEAD ".$dateipfad." HTTP/1.0\r\nHost: ".$host."\r\n\r\n";

$fp=fsockopen($host, 80, &$errno, &$errstr, $timeout);
if (!$fp) {
 die($errstr ($errno)."<br>\n"); // Verbindung fehlgeschlagen
} else {
 fputs($fp, $request);
 while (!feof($fp)) {
  $antwort.=fgets($fp, 128);
 }
 fclose($fp);
}

if (preg_match("~Last-Modified:\s([^\r\n]+)~i", $antwort, $treffer)) {
 $timestamp=strtotime($treffer[1]);
 $zeitstring=date("d.m.y H:i", $timestamp);
 echo($zeitstring." Uhr");
} else {
 echo("unbekannt");
}

?>
-->8--

Obiges ist bspw. unter dem Namen check-lastmod.php zu speichern und kann anschließend in einer anderen .php-datei in folgender Art eingefügt werden:
Letzte Änderung: <?php include("check-lastmod.php"); ?>

Dann dürfte bspw. beim Aufruf dort stehen: "Letzte Änderung: 26.12.01 19:10 Uhr" oder "Letzte Änderung: unbekannt" falls der Server keinen Last-Modified-Header gesendet hat.

Probiere das erst einmal aus. Man kann das auch so modifizieren, dass man das Skript mit Parameter aufruft und so unterschiedliche Dateien abfragen kann.

P.S. Das Skript kann man sicherlich an jeder Ecke optimieren, es ist nur ein Quick'n'Dirty-Hack. ;)

Grüße,
Mathias