URL aus Datenbank auf Erreichbarkeit prüfen (on-/off-Bild)

Wirst dir auch gleich vor den Kopf hauen denk ich mal ;) :D

substr ( string $string , int $start [, int $length ] )
PHP:
substr($text, $start, $laenge)

Jede Antwort von dem Server beginnt mit:

An der wie vielten Stelle im Text beginnt die Zahl? -> $start
Wie lang ist die Zahl? -> $laenge

Probiere erst mal hiermit rum:
PHP:
$text = "HTTP/1.1 200 OK";

$start = ...;
// da wo du denkst

$laenge = ...;
// wie lang die Zahl ist / wieviele Ziffern die Zahl hat

echo substr($text, $start, $laenge);

Das probierst mal bis hierfür "200" ausgegeben wird ;)
 
Zuletzt bearbeitet:
PHP:
$fp = fsockopen($row['kunden_website'], 80, $errno, $errstr, 5);
if (!$fp) {
    $onoffline = "offline";
} else {
    $out = "HEAD / HTTP/1.1\r\n";
    $out .= "Host: ".$row['kunden_website']."\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        $onoffline .= fgets($fp, 128);
		$text = "HTTP/1.1 200 OK";
		$start = "9";
		// da wo du denkst
		$laenge = "3";
		// wie lang die Zahl ist / wieviele Ziffern die Zahl hat
		$onoffline = substr($text, $start, $laenge);
    }
    fclose($fp);
}

So ausgabe ist 200 Ist das den auch richtig, das bei der Adresse "www.hastewas-nicht-dannkannste.de" auch die 200 Steht? Den diese Adresse gibt es doch garnicht! Aber gibt sie mit HTTP/1.1 200 OK am angfang aus.
 
Ähm ja... Also....
Ich bin betrunken also entschuldige meine Art.

Schau dir an was du machst:
PHP:
    while (!feof($fp)) {
        $onoffline .= fgets($fp, 128);
        $text = "HTTP/1.1 200 OK";
        $start = "9";
        // da wo du denkst
        $laenge = "3";
        // wie lang die Zahl ist / wieviele Ziffern die Zahl hat
        $onoffline = substr($text, $start, $laenge);
    }

Was tust du hier?
Nun du machst eine Schleife solange etwas bei $fp ankommt (feof).
Ok! Genau was seien soll.

Aber du holst beliebig oft die "200" aus dem Text "HTTP/1.1 200 OK" (von der 9ten Stelle bis zur 12ten Stelle, wegen der Länge von 3 - mal nebenher: das können Zahlen seien, nicht Strings) und speicherst das in $onoffline.

Welcher Text interessiert dich aber?
Doch wohl nicht der, der in $text ist, welchen du selbst gesetzt hast.

Nochmal: Was willst du wissen?
Ob die Seite On-/Offline ist.

Wo steht die Antwort der Seite?
Nicht in $text, weil das hast du selbst definiert!

Also: Wo steht die Antwort?

(bei dem Programmieren musst du stark an Mathe bzw. Variablen denken, dann findest du die Lösung)

Nenn mir nur die Variable, dann wirst du wissen was zu tun ist.
Und vor allem: Mach das ganze Außerhalb der Schleife.

Beispiel:
Ich gebe dir jede Sekunde einen Buchstaben eines Satzes bzw. Diktates.
Macht es da Sinn jedes mal zu schauen was an der 9ten Stelle ist? Nein.
Erst wenn der "Text" vollständig ist, weist du mit Sicherheit was an der 9ten Stelle ist.
Also das substr erst nach der while.

Entschuldige meine vorlaute oder auch überhebliche Art aber:
1. Betrunken
2. Möchte ich das du selbst drauf kommst
 
Zuletzt bearbeitet:
Ich verstehe das nicht. Das kann doch nie so schwer sein, so eine dämliche on/off anzeige zu bauen. Richtig ich will wissen ob die Seite On/off ist. aber muss es dazu echt so ein langer Code sein?

Brauchst dich bei mir nicht entschuldigen. Ich habe nur keinerlei ahnung mehr wie ich das machen soll. Und komme ganz sicher nicht drauf. Sonst würde der misst schon laufen denke ich mal. Ich brauch gleich selber was zu saufen ...

mfg..Hangrefer
 
Trinken ist keine Lösung!

Andere Übung.
Prüfe die folgende Zeichenketten, auf deren HTTP-Statuscode:
PHP:
$antwort = "HTTP/1.1 200 OK";
$antwort2 = "HTTP/1.1 301";
$antwort3 = "HTTP/1.1 500";

Werte den gegebenen HTTP-Statuscode aus und liefere dafür eine geeignete Antwort!

Beispiel:
Folgender Text:
PHP:
$answer = "HTTP/1.1 404";

Sollte ein "nicht erreichbar" liefern, da der HTTP-Statuscode 404 mit einer 4 beginnt, was auf einen Client-Fehler schließen lässt gemäß dem Wikipedia-Artikel http://de.wikipedia.org/wiki/HTTP-Statuscode

Daran tüftle bitte mal bis morgen früh.
 
Hier liest du ja zeilenweise die Antwort des Servers ein, worin sich der Statuscode verbirgt...du suchst ihn in deinem Code aber garnicht:
Code:
while (!feof($fp)) {
        $onoffline .= fgets($fp, 128);
        $text = "HTTP/1.1 200 OK";
        $start = "9";
        // da wo du denkst
        $laenge = "3";
        // wie lang die Zahl ist / wieviele Ziffern die Zahl hat
        $onoffline = substr($text, $start, $laenge);
    }

fgets($fp, 128) ist dabei also jeweils eine Zeile, in Form eines Strings, strings kann man durchsuchen, bspw. per preg_match()
Code:
if(preg_match('@HTTP/1\.1 ([1-5]\d{2}) @',fgets($fp, 128),$match))
Es wird gesucht nach HTTP/1.1 gefolgt von einer 3stelligen Zahl, deren 1. Ziffer von 1-5 gehen darf. Die Zahl selbst wird dabei zur weiteren Verwendung in $match gespeichert.

Im Erfolgsfall, also wenn eine Zahl gefunden wurde, kann man nachschauen, ob sie einem HTTP-Statuscode 400 oder höher entspricht....ganz simpel per:
Code:
$match[1]>=400

und entsprechend die Variable $onoffline setzen(danach die Schleife beenden, es wird ja nichts mehr gesucht) :
Code:
$onoffline=($match[1]>=400)?'offline':'online';
          break;

Summa summarum:
Code:
    while (!feof($fp)) 
    {
      if(preg_match('@HTTP/1\.1 ([1-5]\d{2}) @',fgets($fp, 128),$match))
       {
          $onoffline=($match[1]>=400)?'offline':'online';
          break;
       } 
    }
 
OKay @ Sven, das habe ich teilweise verstanden.....

Jetzt aber meine frage. Ich kann je den Code denke ich mal schlecht so lassen, und nur die while ändern. Den ich habe ja schon im oberen abschnitt $onoffline ="offline";. Das müsste ja nun dann auch da weg oder?..

Den im moment sind auch Adressen die es nicht gibt IMMERNOCH online ^^. Das darf ja eigentlich nicht sein. Ich habe mir das nun so gedacht.

Wird zwar wieder falsch sein, aber naja ein versuch war es wert.

PHP:
$fp = fsockopen($row['kunden_website'], 80, $errno, $errstr, 5);
if (!$fp) {
    $onoffline = "offline";
} else {
    $out = "HEAD / HTTP/1.1\r\n";
    $out .= "Host: ".$row['kunden_website']."\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) 
    {
      if(preg_match('@HTTP/1\.1 ([1-5]\d{2}) @',fgets($fp, 128),$match))
       {
          $onoffline=($match[1]>=400)?'offline':'online';
          break;
       } 
    }
}

Bitte bitte haut mich nicht gleich.... :(

Mfg..Hangrefer
 
Hast du mittlerweile schon mal eine URL genannt aus der Datenbank, die nicht erreichbar ist, aber dennoch als Online angezeigt wird?

Denn das Skript Funktioniert definitiv.
So hätte ich es geschrieben:
PHP:
$status = "offline";
$fp = @fsockopen("www.guten-tag-und-a.de", 80);

if ($fp)
{
	fputs($fp,
		"HEAD / HTTP/1.1
		Host: www.guten-tag-und-a.de
		Connection: Close
		
		"
	);
	
	$get = fgets($fp, 16);
	if ($get[9] < 4)
	{
		$status = "online";
	}
}
echo $status;
 
Wende dich einmal an den Systemadministrator und frage was da schief laufen kann.
Ab hier bin ich überfragt. Vielleicht bemerkt ein anderer dieses Thema und weis die Antwort.

Für das Skript ist die Seite nicht erreichbar:
PHP:
<?php

/*
 * Meine Variante
 */
$status = "offline";
$fp = @fsockopen("www.links-rechts-geradeaus.de", 80);

if ($fp)
{
	fputs($fp,
		"HEAD / HTTP/1.1
		Host: www.links-rechts-geradeaus.de
		Connection: Close
		
		"
	);
	
	$get = fgets($fp, 16);
	if ($get[9] < 4) $status = "online";
}
echo $status;

/*
 * Deine Variante
 */
$row['kunden_website'] = "www.links-rechts-geradeaus.de";
$fp = fsockopen($row['kunden_website'], 80, $errno, $errstr, 5);
if (!$fp) {
    $onoffline = "offline";
} else {
    $out = "HEAD / HTTP/1.1\r\n";
    $out .= "Host: ".$row['kunden_website']."\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) 
    {
      if(preg_match('@HTTP/1\.1 ([1-5]\d{2}) @',fgets($fp, 128),$match))
       {
          $onoffline=($match[1]>=400)?'offline':'online';
          break;
       } 
    }
}

echo $onoffline;
?>

Ausgabe:
offline

Warning: fsockopen() [...]: php_network_getaddresses: getaddrinfo failed: Der angegebene Host ist unbekannt. [...]
Warning: fsockopen() [...]: unable to connect to http://www.links-rechts-geradeaus.de:80 (php_network_getaddresses: getaddrinfo failed: Der angegebene Host ist unbekannt. )
offline

Man beachte "offline" beide male.
 
Zurück