Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

Anzeige ob Server Online oder Offline ist





Frage

Ich möchte verschiedene Bildarchive meiner Homepage auf einem anderen Server (kostenlosem Webhoster) ablegen. Da einige oft nicht verfügbar sind möchte ich dem User gleich auf der linkpage zu dem jeweiligen Bilderarchiv anzeigen ob die Bilder momentan verfügbar sind (Server online) oder nicht (Server offline). Es soll per Text angezeigt werden nicht als Bild. Oft ist sowas auf War*ez Seiten zu sehen. Jedoch wie´s funktioniert keine Ahnung. Für ein fertiges Script wäre ich sehr dankbar. Mein Webspace unterstützt auch PHP, falls es nur damit geht. Vielen Dank

Antwort 1 von MusicCreator

Hi,
Du meinst sowas wie ein Status-Indikator?
Der Server mit den Bildern müsste dem anderen Server immer "bescheid" sagen,ob er verfügbar ist oder nicht. Mir ist - solange du nicht Besitzer und Betreiber des Servers mit Root-Rechten bist - keine Lösung bekannt, wie du das machen könntest. Es ist vergleichbar mit DynDNS, da muss man seine IP auch updaten und dem Server seinen Status mitteilen. Ich glaube nicht, dass du ohne weiteres etwas machen kannst als Kunde bei einem Provider.

Gruß,
Jens

Antwort 2 von SchmChris

Eine Antwort von Undertaker - Antwort 94

Supportnet Beitrag


Hi MixMax,

> tja wie testet man nun die funktion onerror=
Eine retorische Frage?
Teste übrigends mit meinem FTP-Server...

Also, onerror= und onload= werden von Opera anders interpretiert als vom IE. Aus Gründen der Kompatibilität möchte ich daher von der Benutzung absehen.
Ich denke auch, das ein Delay von 1-2 Sekunden für entsprechend kleine Bilder ausreichen dürften und selbst einen DSL User dürfte diese Zeitspanne nur geringfügig bremsen.

Naja, das mit der Standardseite und weiterführenden Link ist so ein Problem. Der oben gepostete Code war ja für diese Form der Benutzung gedacht. Nur ist es so das es User gibt, die die Anzeige gerne auf der Startseite ihrer Homepage haben wollen und dann den gesamten Code über Tools wie GoLive, Frontpage usw. irgendwo einbauen; Wohlgemerkt mit allen Tags (<html><head><body>)...

Deshalb werde ich mich wohl doch hinsetzen und einen Code-Generator in HTML schreiben...

Aber bis der fertig ist, poste ich nochmal die beiden Codes für WEB- bzw. FTP-Server:

WEB-Server:

<html>  
<head>    
<META HTTP-EQUIV=Content-Type CONTENT=text/html; charset=iso-8859-1>    
<META HTTP-EQUIV=Content-Language CONTENT=de>    
<META NAME=robots CONTENT=NOINDEX,NOFOLLOW>    
<META NAME=GENERATOR CONTENT=AutoDialUp>
<title>Dynamische IP</title>
<script language="JavaScript">      
<!--      
function check() 
{        
if(document.getElementsByName("onlinemeldung")[0].complete == false) {          
document.getElementsByName("onlinemeldung")[0].src='offline.gif';
        } else {   
       location.replace("http://#CIP#/");        
}      
}      
-->    
</script>  
</head>  
<body bgcolor=#00659C>    
<center>      Der Server ist: 
<img src="http://#CIP#/online.gif" width=45 height=13 border=0 name="onlinemeldung">      
<script language="JavaScript">window.setTimeout("check()",2000);</script>  
  </center>  
</body>
</html>


FTP-Server:

Hab ich mal weggelassen

Eine Idee, wie die beiden Bilder aussehen könnten kann man sich z.B.
hier
anschauen...

Gruß
Undertaker

Ende Zitat

Christian

Aber wie schreib ich das nun für meine bedürfnisse um ?

Antwort 3 von semi


<?php
//$img_up    = "up.gif";
//$img_down  = "down.gif";
//$url = $_GET['url'];
$max_redir = 5; // Max. Tiefe bei Umleitung

function checkURL($aurl) {
  $statuscode = 404;
  $urlarr = parse_url($aurl);
  if(isset($urlarr["host"])) {
    $host = $urlarr["host"];
    $port = isset($urlarr["port"]) ? $urlarr["port"] : 80;
    $fp   = fsockopen($host, $port, &$errno, &$errstr, 5);
    if($fp) {
      $path  = isset($urlarr["path"])  ? $urlarr["path"]  : "/";
      $query = isset($urlarr["query"]) ? "?".$urlarr["query"] : "";
      $head = "HEAD " . $path . $query . " HTTP/1.0\r\n\r\n";
      fputs ($fp, $head);

      $statusline = "";
      do {
        $statusline = $statusline . fgets($fp, 128);
	preg_match("/^HTTP\/\d+\.\d+\s+(\d+)/", $statusline, $matches);
        $statuscode = $matches[1];
        $headers = "";
        while(!feof($fp)) {
          $temp = fgets($fp, 1024);
          if(preg_match("/^\015?\012/", $temp)) break;
          $headers = $headers . $temp;
        }
        preg_replace("/\015?\012[ \t]+/", " ", $headers);
        if($statuscode==100) {
          $statusline = "";
        }
      } while($statuscode == 100);

      fclose($fp);
      if(preg_match("/^(301|302|303)$/", $statuscode)) {
        preg_match("/^location:[ \t]*(\S*)/im", $headers, $matches);
        if(isset($matches[1])) {
          return array("status"=>$statuscode, "location"=>$matches[1]);
        }
      }
    } // if($fp)
  } // if(isset(...
  return ($statuscode==200)?array("status"=>200):array("status"=>404);
}

$redircount=0;
while($redircount<$max_redir) {
  $response = checkURL($url);
  $status = $response["status"];
  if($status==200) {
    //header ("Location: $img_up");
    echo "OK";
    exit;
  }
  else if($status==404) {
    //header ("Location: $img_down");
    echo "Not found or down";
    exit;
  }
  $url = $response["location"];
  $redircount++;
  //echo "Redirection $redircount, URL: $url<br>";
}
echo "Too many redirections (>$max_redir)";
//header ("Location: $img_down");

?>

Verwendung:

urlcheck.php?url=http://www.o-auch-immer.de/abc.zip

Antwort 4 von SchmChris

Kann man das irgendwie auch mit dem include befehl umsetzen ?


<?php

include("seiten/check.php?url=http://www.domain.de/schmchris/bilder/0001/status.txt");

?>


Geht leider nicht das bringt er

Warning: open_basedir restriction in effect. File is in wrong directory

und

Warning: Failed opening 'seiten/check.php?url=http://www.domain.de/schmchris/bilder/0001/status.txt' for inclusion (include_path='.:/usr/local/lib/php') in /home/www/...

Kannst du mir weiterhelfen Semi ?


Antwort 5 von semi

Mach es mit der vollständigen Adresse

include("http://www.abc.com/check.php?url=http://www..../status.txt");

Gruß,
Michael

Antwort 6 von semi

Oder noch besser, wenn du die zu prüfende Adresse korrekt codierst

http%3A%2F%2Fwww.domain.de%2Fschmchris%2Fbilder%2F0001%2Fstatus.txt

: = %3A
/ = %2F

Antwort 7 von SchmChris

Super, perfekt, Danke !

Antwort 8 von SchmChris

Hab es getestet lokal wenn ich vom Server auf eine Datei lokal zugreife geht es, aber wenn ich auf ne datei im netz zugreifen will schreibt er immer offline !

Vielleicht kapier ich es aber auch net !

Kannste nochmal schauen vielleicht wenn du zeit hast semi!


Link




<?php
include("http://www.schmchris.net/seiten/check.php?url=http://
www.amschroeck.de/schmchris/bilder/0001/status.txt");
?>


Danke

Antwort 9 von semi

Du mußt die url codieren und immer mit http... angeben.
<?php
include("http://www.schmchris.net/seiten/check.php?url=http%3A%2F%2F
www.amschroeck.de%2Fschmchris%2Fbilder%2F0001%2Fstatus.txt");
?>

Ich habe mir die Seite angeschaut, bis auf einen Eintrag sind alle online.
Übrigens, die Schriftfarbe links neben dem Text online/offline ist viel zu hell, man sieht nichts.

Antwort 10 von semi

Übrigens, die eine Seite, die "offline" ist, ist fehlerhaft.
http://www.amschroeck.de/schmchris/bilder/0001/index.php

Antwort 11 von SchmChris

Ich hab nur den einen roten umgesetzt und nun auch den Code den du oben angeben hast eingefügt. es geht nicht.


Direktstatus


Aber wenn du dann testet und die datei direkt aufrufst siehst du das sie existiert !

Antwort 12 von SchmChris

Wenn die seite ja includet wird stimmen die Pfade ja wieder.

Das zu ändern bekomm ich hin leider bin ich bei der online/offline anzeige auf profis angewiesen !

Antwort 13 von semi

Hmm. Auf dem Server ist Apache 1.3.19 mit PHP 4.0.6 drauf und es meldet Error 501 Method not implemented.
Klartext: Der Server scheint die HEAD Anforderung nicht zu verstehen, sie ist deaktiviert oder ich habe irgendwo Unsinn in der HEAD-Abfrage.
Moment ich muß paar Sachen testen.

Antwort 14 von semi

Versuche mal die folgende abgekürzte Version, ohne Fehlerprüfung oder Weiterverfolgung der Links bei evtl. Umleitung.


<?php
$purl = parse_url($url);
$socket = fsockopen(
        $purl['host'],
	empty($purl['port'])?getservbyname($purl['scheme'],'tcp'):$purl['port'],
        &$errno, &$errstr, 5
      );
if($socket) {
  fputs($socket, "HEAD $url HTTP/1.0\r\n\r\n");
  $response = fgets($socket, 16);
  fclose($socket);
  if(preg_match("/^HTTP\/\d+\.\d+\s+200/", $response)) {
    echo 'online';
    exit;
  }
}
echo 'offline';
?>

Frohe Weihnachten!
Michael

Antwort 15 von MusicCreator

So ist es also doch machbar, entschuldigung für meine erste Antwort. Ich hab nicht daran gedacht, dass man ein Script zum Überprüfen des Statuses schreiben kann.

Allen ein schönes Fest!
Jens

Antwort 16 von SchmChris

Danke semi - Michael

Nun funktioniert es prima.

Frohe Weihnachten !

Christian

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: