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



## Hangrefer (29. April 2009)

Ja kollegen, ich bin am rätzeln. Ich möchte gerne mehrere url´s aus der datenbank auf erreichbarkeit prüfen.

dazu habe ich volgendes

*Prüfung auf erreichbarkeit *

```
$fp = @fsockopen ($kunden_website,80,$errno,$errstr,2);   
  if (!$fp) {
   $onoffline = "Offline";   
   }else{   
   $onoffline = "online";   
  fclose($fp);   
  }
```


*while schleife*


```
$result = $db->query("SELECT * FROM bb".$n."_kundenlist ORDER BY kunden_id ASC");
	while($row = $db->fetch_array($result)){
	
		$kunden_id = $row['kunden_id'];
}
```
$kunde_website, ergibt sich aus der while schleife. Nur weis ich leider nicht, wie ich das hin bekomme das er das auch prüft. Den derzeit habe ich komischer weise alles ONLINE obwohl absichtlich eine url eingegeben habe in der Datenbank die nicht existiert.

kann mir da einer weiterhelfen?

Mfg...Hangrefer


----------



## ZodiacXP (29. April 2009)

Ist es Möglich das du uns die Adresse sagst, welche Offline seien soll?
Was du machst ist eine Verbindung zum Server herzustellen, die in der Regel so gut wie immer klappt. Vielleicht solltest du noch den Header auslesen und den Statuscode prüfen. Beginnt dieser mit einer 4, einer 5 oder ist nicht gegeben dann würde ich die Seite als nicht erreichbar einstufen. 3 Statuscodes müsste man allerdings verfolgen um zu ob die Seite erreichbar ist.

Wenn du die Möglichkeit hast eine Erweiterung zu PHP hinzuzufügen, geht das sehr leicht mit diesem hier:
http://de.php.net/manual/en/book.http.php
http://de.php.net/manual/en/function.http-get.php
http://de.php.net/manual/en/http.request.options.php


----------



## Hangrefer (30. April 2009)

Die Adressen die er prüfe soll, sollen alles aus der variable $kunden_wensite geholt werden. Den die stehe alle in der Datenbank. 

gibt es also keine möglichkeit, den code zum prüfen mit der while schleife zu verbinden? oder muss es so kompliziert gemacht werden? ich möchte die Adresse ja nicht manuell in die php eingeben müssen. Sondern das er diese aus der Datenbank holt. DAS klappt ja schon fast, aber dennoch steht überall ONLINE obwohl ich eine der Adressen absichtlich falsch in der Db abgelegt habe

Mfg..Hangman


----------



## ZodiacXP (30. April 2009)

Hangrefer hat gesagt.:


> Die Adressen die er prüfe soll, sollen alles aus der variable $kunden_wensite geholt werden. Den die stehe alle in der Datenbank.





ZodiacXP hat gesagt.:


> Ist es Möglich das du uns die Adresse sagst, welche Offline seien soll?


Wenn nicht dann lassen wir die hier behandelte URL einmal http://www.hangrefer.eu sein.



Hangrefer hat gesagt.:


> gibt es also keine möglichkeit, den code zum prüfen mit der while schleife zu verbinden? oder muss es so kompliziert gemacht werden?



Doch gibt es und es ist nicht kompliziert.


ZodiacXP hat gesagt.:


> Vielleicht solltest du noch den Header auslesen und den Statuscode prüfen.





Hangrefer hat gesagt.:


> muss es so kompliziert gemacht werden?



Es ist doch nur den sogenannten Header auslesen, Statuscode auslesen und prüfen:


ZodiacXP hat gesagt.:


> Beginnt dieser mit einer 4, einer 5 oder ist nicht gegeben dann würde ich die Seite als nicht erreichbar einstufen. 3 Statuscodes müsste man allerdings verfolgen um zu ob die Seite erreichbar ist.






Hangrefer hat gesagt.:


> ich möchte die Adresse ja nicht manuell in die php eingeben müssen. Sondern das er diese aus der Datenbank holt. DAS klappt ja schon fast, aber dennoch steht überall ONLINE obwohl ich eine der Adressen absichtlich falsch in der Db abgelegt habe



Gut dann führe ich dich jetzt an die Lösung heran:
Lies dir das erste Beispiel (dort: "Example") bei fsockopen auf php.net an (http://de.php.net/manual/en/function.fsockopen.php) und wende es zunächst auf die hier behandelte URL (siehe oben) an.
Statt einem GET wie es dort steht schreibt du ein HEAD.
Und statt der Ausgabe per echo schreibst du es in eine Variable ($var = ...).
Diesen Ansatz zeigst du dann bitte.

Und dazu auch die Ausgabe für die obige URL und/oder eine weitere Ausgabe für eine Adresse deiner Wahl.


----------



## Hangrefer (2. Mai 2009)

Oki, ich war arbeiten... Jetzt habe ich deinen Beitrag gelesen, und denke auch fast verstanden. Ich teste das nun gleich auch einmal aus, und berichte dir dann was raus gekommen ist. Bis hierher danke ich dir recht herzlich!....


Edit: 03.05.2009

also habe das nun mal testen können. Er gibt mir nichts aus. Lediglich wenn ich das echo lasse zeigt der mir was (keine Fehlermeldung). Dies ist aber auch nicht ONLINE oder OFFLINE. Aber wenn ich eine Variabel vergebe, ist nicht zu sehen. 

hier das habe ich gemacht?!.. ist doch richtig oder?


```
$fp = fsockopen("www.hangrefer.eu", 80, $errno, $errstr, 5);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "HEAD / HTTP/1.1\r\n";
    $out .= "Host: www.hangrefer.eu\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        $onoffline = fgets($fp, 128);
    }
    fclose($fp);
}
```
Mfg...Hangrefer


----------



## Hangrefer (6. Mai 2009)

Hy... könnte man hier nochmal drüber schauen?... Möcht schon gerne wissen was ich falsch mache


----------



## ZodiacXP (6. Mai 2009)

Hangrefer hat gesagt.:


> Lediglich wenn ich das echo lasse zeigt der mir was (keine Fehlermeldung).



Was gibt er denn zum Beispiel aus?
Zeige doch zwei oder drei Varianten.
Einfach echo $onoffline;



Hangrefer hat gesagt.:


> Aber wenn ich eine Variabel vergebe, ist nicht zu sehen.



Logisch, weil dann alles intern in die Variable gepackt wird.


----------



## Hangrefer (6. Mai 2009)

also ich habe jetzt mal $onoffline wieder nur in echo gemacht. Ausgeben tut er mir dies hier 


*HTTP/1.1 200 OK Date: Wed, 06 May 2009 19:06:29 GMT Server: Apache/2.2.4 (Linux/SUSE) X-Powered-By: PHP/5.2.4 Connection: close Content-Type: text/html HTTP/1.1 200 OK Date: Wed, 06 May 2009 19:06:29 GMT Server: Apache/2.2.4 (Linux/SUSE) X-Powered-By: PHP/5.2.4 Connection: close Content-Type: text/html HTTP/1.1 200 OK Date: Wed, 06 May 2009 19:06:29 GMT Server: Apache/2.2.4 (Linux/SUSE) X-Powered-By: PHP/5.2.4 Connection: close Content-Type: text/htm*

Mit echo $onoffline; ggeht garnichts. Versucht habe ich auch nur $onoffline =" Online"; und das selbe nur in offline.

Hier ist mal mein gesammter versuch.


```
$result = $db->query("SELECT * FROM bb".$n."_kundenlist");
	while($row = $db->fetch_array($result)){

           $kunden_website = $row['kunden_website'];

$fp = fsockopen($row['kunden_website'], 80, $errno, $errstr, 5);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} 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);
    }
    fclose($fp);
}
```

So habe ich das im Moment. Aber geht leider nicht wie ich will^^...
den dann gibt der mir was Fahlerhaftes aus....

*Warning: fsockopen() [function.fsockopen]: unable to connect to http://www.google.de:80 (Unable to find the socket transport "http" - did you forget to enable it when you configured PHP?) in /var/www/web44/html/codebase/acp/kundenlist.php on line 33
Unable to find the socket transport "http" - did you forget to enable it when you configured PHP? (-1222790701)*

das http://www.google.de, ZIEHT der sich aus der datenbank. Also das scheint ja zu Funktionieren das der sich die Adresse aus der Db holt. Nur mit dem HTTP:// hat der probleme. Ist http:// vor einer url dann ist die immer offline. Ist aber kein Http:// davor ist die seite ONLINE aber auch dann ONLINE, wenn es die adresse ja nichtmal gibt!.. Woran liegt das den nun wieder?


----------



## Sven Mintel (6. Mai 2009)

das HTTP-Protokoll wird von fsockopen nicht unterstützt, was auch die Fehlermeldung besagt.
Wenn du das http:// weglässt, wird das Standardprotokoll verwendet(TCP) verwendet...weswegen es dann auch funktioniert.

Warum da dann immer ONLINE steht, lässt sich nur sagen, wenn man sieht, wo du dieses "Online" ausgibst...was derzeit nicht zu Erkennen ist.


----------



## ZodiacXP (6. Mai 2009)

Hangrefer hat gesagt.:


> *HTTP/1.1 200 OK*



Dort siehst du für jeden Request den HTTP-Statuscode (die dreistellige Zahl).
Diese sagt dir unter anderem ob die Seite Online ist oder nicht.
http://de.wikipedia.org/wiki/HTTP-Statuscode

Wie SvenMintel sagt, solltest du uns wirklich mal deine Art der Prüfung nennen.
Oder die URL bei welcher es so seien sollte.
Kann ja nicht sein das eine nicht-existenter Host Online seien soll.


----------



## Hangrefer (6. Mai 2009)

$onoffline = fgets($fp, 128); hatte ich in $onoffline ="online"; gemacht. aber dann dauert das ewig lange bis meine seite geladen ist und der Status da steht. aber wie gesagt Dennoch ist alles ONLINE obwohl erfundene adresse geschrieben sind.

ich hatte es zb mit der url http://www.hastewaskannste-odernicht.de versucht. und das selbe mir Ohne http:// alles Online.. verstehe ich selber nicht. Und zum anderen weis ich ja nicht genau wie ich es ausgeben kann das es in roter farbe OFFLINE steht und in grüner farbe ONLINE. Wenn ich am $onoffline = fgets($fp, 128); rum bastel ist alles voll lahm. da brauch das Script ewig um was zu prüfen.


@ZodiacXP wie meinst du das?

Zitat:

Wie SvenMintel sagt, solltest du uns wirklich mal deine Art der Prüfung nennen.
Oder die URL bei welcher es so seien sollte. Zitat Ende

Mfg...Hangrefer


----------



## Sven Mintel (7. Mai 2009)

Hangrefer hat gesagt.:


> $onoffline = fgets($fp, 128); hatte ich in $onoffline ="online"; gemacht. aber dann dauert das ewig lange bis meine seite geladen ist und der Status da steht. aber wie gesagt Dennoch ist alles ONLINE obwohl erfundene adresse geschrieben sind.



Wenn eine Seite nicht online ist, dauert es 5 Sekunden lang, dies festzustellen, denn das hast du bei fsockopen() als Timeout-Parameter angegeben....deshalb dauert es.

Dass alle Seiten als "online" deklariert werden, liegt vielleicht daran, dass du die Variable $onoffline im Fehlerfall nicht mit einem anderen Wert (offline) belegst...zumindest geht das aus dem zuletzt geposteten Skript nicht hervor.

Den fputs-Teil kannst du dir dabei übrigens sparen, solange du keine spezielle Adresse auf dem Host kontaktierst.
	
	
	



```
<?php
$hosts=array(
  'www.google.de',
  'www.hastewaskannste-odernicht.de',
  'www.tutorials.de'  
);
foreach($hosts as $host)
{
  $fp = @fsockopen($host, 80, $errno, $errstr, 5);
  if(!$fp)
  {
    $onoffline='offline';
  }
  else
  {
    $onoffline='online';
    fclose($fp);
  }
  echo '<hr />'.$host.':'.$onoffline;
}
?>
```


----------



## ZodiacXP (7. Mai 2009)

@Sven: Auch erreichbare Server, die 404 oder 500 liefern sollen als Offline angezeigt werden. Daher dieser weg.



Hangrefer hat gesagt.:


> $onoffline = fgets($fp, 128); hatte ich in $onoffline ="online"; gemacht. aber dann dauert das ewig lange bis meine seite geladen ist



Das liegt an dem Server den du erreichen willst, nicht an deiner Seite.
Wenn dir das zu langsam ist, dann lass ein CronJob (u.U. http://www.cronjob.de) laufen, der die Seiten täglich / stündlich prüft  und das Ergebnis in eine seperate Tabelle ablegt.




Hangrefer hat gesagt.:


> Dennoch ist alles ONLINE obwohl erfundene adresse geschrieben sind.


Nochmal: Wie lässt du PHP das Prüfen? Bisher kriegst du nur eine Antwort von dem Server, die für PHP natürlich schlichter nichtsaussagender Text ist.
Von daher: Womit prüfst du das? Woran siehst du das?



Hangrefer hat gesagt.:


> @ZodiacXP wie meinst du das?


s.o.


----------



## Hangrefer (7. Mai 2009)

ZodiacXP hat gesagt.:


> Nochmal: Wie lässt du PHP das Prüfen? Bisher kriegst du nur eine Antwort von dem Server, die für PHP natürlich schlichter nichtsaussagender Text ist.
> Von daher: Womit prüfst du das? Woran siehst du das?



Ich verstehe echt nicht was du damit meinst. Ich lasse doch das Script Prüfen ob die url erreichbar ist. wenn das nicht der fall ist soll es offline angezeigt werden. Und wenn ja dann eben Online.

Ich dachte das wäre schon die Prüfung von php. Was anderes fällt mir leider nicht ein. Aber ich kann ja mal erkläre wie ich das angedacht hatte.

Also:

Ich habe mir ja die Ausgabe der Adresse durch eine while schleifen gebaut. Mit *$row["kunden_website"]; * soll die Adresse aus der Datenbank in das Script *fsockopen* geholt werden. Dies klappt ja ohne Probleme. Jetzt möchte ich aber auch, das der wehrt, in eine $var gespeichert wird, mit der dann in meinem Template der Status ausgegeben werden soll. Das allerdings mach das Script nicht. Da ich nicht weis, wie ich das in eine $var Speichern soll. 

So lasse ich das alles Prüfen. Was anderes prüfe ich ja nicht oder?. Ich hoffe nun kannst du mir weiter helfen. Staune eh das du dich noch weiter mit mir beschäftigst da ich ja anscheinend nichts Kapiere...

@Sven: auch damit werden Webseite mit Facke Adresse als Online angezeigt. ^^

Mfg...


----------



## Sven Mintel (7. Mai 2009)

Hangrefer hat gesagt.:


> @Sven: auch damit werden Webseite mit Facke Adresse als Online angezeigt. ^^
> 
> Mfg...


Das möchte ich anzweifeln ;-]
Sollte es dennoch so sein, dass mein Codeschnipsel dir die Ausgabe

```
www.hastewaskannste-odernicht.de:online
```
liefert, müsste man die Lösung des hier besprochenen Problems tatsächlich woanders suchen als in deinem Skript


----------



## Hangrefer (7. Mai 2009)

Sven Mintel hat gesagt.:


> Das möchte ich anzweifeln ;-]
> Sollte es dennoch so sein, dass mein Codeschnipsel dir die Ausgabe
> 
> ```
> ...



Habe es eben nochmal getestet. JA, dein Codeschnippet, liefert mir ein Online bei *http://www.hastewaskannste-odernicht.de*.


----------



## Sven Mintel (7. Mai 2009)

Mmmh, dann läuft auf dem Server etwas schief, sag ich mal 

Möglich wäre bspw., dass die Verbindung über einen Proxy hergestellt wird, hier mal ein Kommentar dazu aus dem Online-Manual:





> *laisebrown at gmail dot com
> 26-Oct-2008 11:30*
> When you're connecting through a proxy server you can't rely on fsockopen returning false to indicate that the connection has failed. (This also applies to fgets and fwrite.)
> 
> ...


----------



## Hangrefer (7. Mai 2009)

Ich bin so langsam am verzweifeln. keine ahnung was ich noch alles machen soll......


----------



## ZodiacXP (7. Mai 2009)

Hangrefer hat gesagt.:


> Ich verstehe echt nicht was du damit meinst. Ich lasse doch das Script Prüfen ob die url erreichbar ist.



Letzteres ist meine Frage: Wo? Zeigen!



Hangrefer hat gesagt.:


> Jetzt möchte ich aber auch, das der wehrt, in eine $var gespeichert wird, mit der dann in meinem Template der Status ausgegeben werden soll. Das allerdings mach das Script nicht. Da ich nicht weis, wie ich das in eine $var Speichern soll.



$var .= fgets($fp);
So wie du es hattest.



Hangrefer hat gesagt.:


> So lasse ich das alles Prüfen. Was anderes prüfe ich ja nicht oder?



Prüfung? Du prüfst ob in der Variable etwas drin steht? So verstehe ich deinen Satz.
Wenn nun der Server liefert: "Ich bin kaputt" hieße das bei so einer Prüfung, der Server ist "Online".

Nein. Hier hat es doch schon wunderbar geklappt:
http://www.tutorials.de/forum/php/3...eichbarkeit-pruefen-off-bild.html#post1757629

Da wurden auch schöne Sachen in $onoffline geschrieben. Aus der Zeichenkette (String) musst du nur noch die Zahl nach dem HTTP/1.1 erreichen. Das geht allein mit substr():
http://de.php.net/manual/de/function.substr.php oder http://www.selfphp.de/funktionsreferenz/string_funktionen/substr.php


----------



## Hangrefer (7. Mai 2009)

Na dann ist ja gut das es so schon mal hinhaut. Nun muss ich nur noch wissen wie genau ich  substr() genau anwenden muss. Den ich möchte ja, das zum schluss entweder Online oder Offline im Template steht. Die beiden Seiten die du mir zeigst da sehe ich leider nicht durch. Die beispiele Die beispiele geben mir recht wenig ansatz wie ich die reihen folge erstellen muss.

man man... ich komme mir langsam vor als wäre ich total behämmert :-(


----------



## ZodiacXP (7. Mai 2009)

Wirst dir auch gleich vor den Kopf hauen denk ich mal  

substr  ( string $string  , int $start  [, int $length  ] )

```
substr($text, $start, $laenge)
```

Jede Antwort von dem Server beginnt mit:


> HTTP/1.1 200 OK



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

Probiere erst mal hiermit rum:

```
$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


----------



## Hangrefer (7. Mai 2009)

```
$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.


----------



## ZodiacXP (7. Mai 2009)

Ähm ja... Also....
Ich bin betrunken also entschuldige meine Art.

Schau dir an was du machst:

```
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


----------



## Hangrefer (8. Mai 2009)

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


----------



## ZodiacXP (8. Mai 2009)

Trinken ist keine Lösung!

Andere Übung.
Prüfe die folgende Zeichenketten, auf deren HTTP-Statuscode:

```
$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:

```
$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.


----------



## Sven Mintel (8. Mai 2009)

Hier liest du ja zeilenweise die Antwort des Servers ein, worin sich der Statuscode verbirgt...du suchst ihn in deinem Code aber garnicht:

```
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()
	
	
	



```
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:

```
$match[1]>=400
```

und entsprechend die Variable $onoffline setzen(danach die Schleife beenden, es wird ja nichts mehr gesucht) :
	
	
	



```
$onoffline=($match[1]>=400)?'offline':'online';
          break;
```

Summa summarum:
	
	
	



```
while (!feof($fp)) 
    {
      if(preg_match('@HTTP/1\.1 ([1-5]\d{2}) @',fgets($fp, 128),$match))
       {
          $onoffline=($match[1]>=400)?'offline':'online';
          break;
       } 
    }
```


----------



## Hangrefer (8. Mai 2009)

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.


```
$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


----------



## ZodiacXP (8. Mai 2009)

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:

```
$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;
```


----------



## Hangrefer (8. Mai 2009)

Ja habe ich... also hier habe ich nun diese URL eingegeben.

*http://www.links-rechts-geradeaus.de* Diese URL GIBT ES NICHT. Aber zeigt sie mir dennoch als Online an.


----------



## ZodiacXP (8. Mai 2009)

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

/*
 * 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.


----------



## Hangrefer (8. Mai 2009)

Naja ist doch richtig. Diese adresse ist ja nicht mal als Domain registriert! Und somit MUSS die auch OFFLINE anzeigen. Nur mein script (siehe http://www.tutorials.de/forum/php/3...chbarkeit-pruefen-off-bild-2.html#post1758238 )  

zeigt du als online an. was ist da jetzt nun falsch


----------



## ZodiacXP (8. Mai 2009)

Hangrefer hat gesagt.:


> Naja ist doch richtig. Diese adresse ist ja nicht mal als Domain registriert! Und somit MUSS die auch OFFLINE anzeigen.



Meine reden.



Hangrefer hat gesagt.:


> Nur mein script (siehe http://www.tutorials.de/forum/php/3...chbarkeit-pruefen-off-bild-2.html#post1758238 )
> 
> zeigt du als online an.



Wie gezeigt, funktioniert dein Skript an dieser Stelle ebenfalls. Nur komischerweise bei dir nicht.



Hangrefer hat gesagt.:


> was ist da jetzt nun falsch



Letzte Bastion:

```
echo "Test: " . $row['kunden_website'] . "<br/>"; flush();
$fp = fsockopen($row['kunden_website'], 80, $errno, $errstr, 5);
if (!$fp) {
    echo "Nicht erreichbar<br/>"; flush();
    $onoffline = "offline";
} else {
    $out = "HEAD / HTTP/1.1\r\n";
    $out .= "Host: ".$row['kunden_website']."\r\n";
    $out .= "Connection: Close\r\n\r\n";
    echo "Sende<br/>"; flush();
    fwrite($fp, $out);
    while (!feof($fp)) 
    {
      if(preg_match('@HTTP/1\.1 ([1-5]\d{2}) @',fgets($fp, 128),$match))
       {
          echo "Empfange: " . $match[0] . "<br/>"; flush();
          echo "Status: " . $match[1] . "<br/>"; flush();
          $onoffline=($match[1]>=400)?'offline':'online';
          break;
       } 
    }
    echo "Ergebnis: " .$onoffline . "<br/>"; flush();
}
```

Bitte davon die Ausgabe hier im Forum zeigen.


----------



## Hangrefer (8. Mai 2009)

hier die ausgabe

*Test: http://www.google.de
Sende
Empfange: HTTP/1.1 200
Status: 200
Ergebnis: online
Test: http://www.xxx.xxx.de
Sende
Empfange: HTTP/1.1 200
Status: 200
Ergebnis: online
Test: http://www.links-rechts-geradeaus.de
Sende
Empfange: HTTP/1.1 200
Status: 200
Ergebnis: online*

das passiert! wie du siehst sind 2 adrsse die es nicht gibt dabei. und werden als ONLINE angezeigt.


----------



## ZodiacXP (8. Mai 2009)

Paradox.
Und jetzt zerstören wir die Burg gänzlich:

```
echo "Test: " . $row['kunden_website'] . "<br/>"; flush();
$fp = fsockopen($row['kunden_website'], 80, $errno, $errstr, 5);
echo "<pre>";
var_dump($fp, $errno, $errstr);
echo "</pre>";
$match = array(); $onoffline = "";
if (!$fp) {
    echo "Nicht erreichbar<br/>"; flush();
    $onoffline = "offline";
} else {
    $out = "HEAD / HTTP/1.1\r\n";
    $out .= "Host: ".$row['kunden_website']."\r\n";
    $out .= "Connection: Close\r\n\r\n";
    echo "Sende<br/>"; flush();
    fputs($fp, $out);
    while (!feof($fp)) 
    {
      $s = fgets($fp);
      if(preg_match('@HTTP/1\.1 ([1-5]\d{2}) @', $s,$match))
       {
          echo "Empfange: " . $s . "<br/>"; flush();
          echo "Status: " . $match[1] . "<br/>"; flush();
          $onoffline=($match[1]>=400)?'offline':'online';
          break;
       } 
    }
    echo "Ergebnis: " .$onoffline . "<br/>"; flush();
    fclose($fp);
}
```


----------



## Hangrefer (8. Mai 2009)

nein leider übergibt er das  selbe ergebniss  

*Test: http://www.google.de

resource(19) of type (stream)
int(0)
string(0) ""

Sende
Empfange: HTTP/1.1 200 OK
Status: 200
Ergebnis: online
Test: http://www.xxx.xxx.de

resource(21) of type (stream)
int(0)
string(0) ""

Sende
Empfange: HTTP/1.1 200 OK
Status: 200
Ergebnis: online
Test: http://www.links-rechts-geradeaus.de

resource(22) of type (stream)
int(0)
string(0) ""

Sende
Empfange: HTTP/1.1 200 OK
Status: 200
Ergebnis: online*

Mfg..Hangrefer


----------



## ZodiacXP (8. Mai 2009)

Da schreibst du am besten mal eine Mail an den Systemadministrator und fragst ihn ob die Funktion fsockopen verändert wurde oder ähnliches und schilderst ihn den Fall mit einem Link zu dem Thema hier.
Und wär nett wenn du dich dann nochmal meldest und berichtest was er gesagt hat


----------



## Hangrefer (8. Mai 2009)

okay mache ich... danke erstmal bis hierhin!


----------



## Crav3X (8. Mai 2009)

Hallo,

bei mir funktioniert deine Lösung ZodiacXP, nur total langsam... dauert echt ne halbe minute wenn er das überprüft... aber mit dem richtigen Ergebniss


```
$page = "www.google.de";


$status = "offline";
$fp = @fsockopen($page , 80);

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


DIe letzten versionen von "euch" funktioniert bei mir genau so wenig wie bei Hangrefer. Auch alles angeblich Online obwohl es die Domains nicht gibt.

Sehr komisch... vllt gibts ein anderen lösungsweg!? zb kann man ja auch mit PHP Pingen... vllt wäre das auch ne möglichkeit um raus zu bekommen ob eine adresse/Server erreichbar ist...


----------



## Hangrefer (8. Mai 2009)

Crav3X hat gesagt.:


> Hallo,
> 
> bei mir funktioniert deine Lösung ZodiacXP, nur total langsam... dauert echt ne halbe minute wenn er das überprüft... aber mit dem richtigen Ergebniss
> 
> ...



also bei mir geht das script nicht!.. er muss ja zur zeit 3 url´s aus der Db hollen und 2 davon sind fack adressen  weiste ^^


----------



## Crav3X (8. Mai 2009)

Hangrefer hat gesagt.:


> also bei mir geht das script nicht!.. er muss ja zur zeit 3 url´s aus der Db hollen und 2 davon sind fack adressen  weiste ^^




```
<?

$page = "www.nehomepagedieesnichtgibt.de";


$status = "offline";
$fp = @fsockopen($page , 80);

if ($fp)
{
    fputs($fp,
        "HEAD / HTTP/1.1
        Host: ".$page."
        Connection: Close
        
        "
    );
    
    $get = fgets($fp, 16);
    if ($get[9] < 4)
    {
        $status = "online";
    }
}
echo $status;  
?>
```

Ausgabe

```
offline
```

Funktioniert... auch wenns ung. 30sec dauert bis die seite geladen ist.


----------



## ZodiacXP (8. Mai 2009)

Crav3X hat gesagt.:


> Hallo,
> 
> bei mir funktioniert deine Lösung ZodiacXP, nur total langsam... dauert echt ne halbe minute wenn er das überprüft... aber mit dem richtigen Ergebniss



Ups. Die Formatierung ist in diesem Fall dafür verantwortlich, dass es solang dauert 

Und zwar hier:

```
fputs($fp,
        "HEAD / HTTP/1.1
        Host: ".$page."
        Connection: Close
        
        "
    );
```

Wenn man es so macht gehts schneller:

```
fputs($fp,
        "HEAD / HTTP/1.1\r\nHost: ".$page."\r\nConnection: Close\r\n\r\n"
    );
```

Als Funktion für die Allgemeinheit:

```
function UrlOnline($url)
{
	$fp = @fsockopen($url, 80);

	if ($fp)
	{
		fputs($fp,
			"HEAD / HTTP/1.1\r\nHost: " . $url . "\r\nConnection: Close\r\n\r\n"
		);
	    $get = fgets($fp, 16);
		return ($get[9] < 4);
	}
	return false;
}
```


----------



## Crav3X (8. Mai 2009)

Das ja super...
Funktioniert Rats Fatz!

Herzlichen Dank 

Nachtrag:

Ok, es wird wohl an der Servereinstellung liegen. Auf nem Lokalen Test Webserver funktioniert es genau so wie es soll. Auf meinem Root funktioniert es nicht... zeigt IMMER Online an.

hmm... ok, Einstellung, fragt sich nur welche^^


----------



## Hangrefer (9. Mai 2009)

Also mein Hoster, möchte gerne wissen woran es liegen könnte das nicht geht. Welche Server seitigen Einstellungen gemacht werden müssten ect.

Er sagte das es normalerweise gehen müsste. Dann erst kann er schauen wie er das problem lösen könnte. Aber er sagte auch, das er nicht glaubt das an den Server seitigen Einstellungen liegen sollte.

Ich habe das Script auf dem Rechner per Xammp das Script getestet und siehe da es geht. KÖNNTE es auch an der Firewall liegen die mein Hoster hat? Aber die blockt ja nicht den Port 80, somit kann das ja auch nicht sein. 

mfg...Hangrefer


----------



## ZodiacXP (9. Mai 2009)

Es kann gut Möglichsein, dass ausgehende Verbindungen zurückgeleitet werden auf deine eigene Seite. Das ist gut Möglich, wenn man sich nochmal die Antworten  ansieht http://www.tutorials.de/forum/php/3...eichbarkeit-pruefen-off-bild.html#post1757629

Teste das auf dem Server:

```
$fp = fsockopen("www.some-where-over-the-rainbow-and-beyond.org", 80);

fputs($fp,
        "GET / HTTP/1.1\r\nHost: www.some-where-over-the-rainbow-and-beyond.org\r\nConnection: Close\r\n\r\n"
);
while (!feof($fp))
        $get = fgets($fp);

echo $get;
```

Wenn du dabei deine eigene Seite siehst oder ähnliches, dann weist du dass du zurück geschickt wirst auf den eigenen Server und Verbindungen nach außen durch den Apache / PHP von deinem Hoster nicht erlaubt sind. Da würde mich dann wundern, dass gesagt wird es müsse _eigentlich_ gehen.

Was es mit so einer Rückleitung auf sich hat, erfährt der Serveradministrator deines Vertrauens mit Sicherheit dort, wo er Apache und PHP her hat. Eine übliche Version scheint es nicht zu sein. Da wurde sicherlich was modifiziert 

Alternativen wären dann cURL oder HTTP-Erweiterung. Da weis dein Admin wie er die aktivieren kann.


----------



## Hangrefer (9. Mai 2009)

also antwort vom Hoster war, er haut gleich cURL drauf. Meine frage. kann dann der code so bleiben wie er ist ?... also der letzte LANGE Code von dir 

Mfg...Hangrefer

Ps: der Code über mir zeigt bzw gibt nichts aus^^...oder ich bin zu doof wiedermal..


----------



## ZodiacXP (9. Mai 2009)

Hangrefer hat gesagt.:


> kann dann der code so bleiben wie er ist ?



Er legt ein ICE aufs Gleis und du willst mit der Lok, die im Kreis fährt, weiterfahren? 

Nein, der Code funktioniert doch allem Anschein nicht.
Jetzt wird es etwas einfacher / kürzer:
http://de.php.net/manual/de/book.curl.php


----------



## Hangrefer (10. Mai 2009)

Ach du heiliger... damit habe ich noch nie gearbeitet^^ auf der Seite verstehe ich nur Bahnhof. cURL hat er nun installiert.



```
$creq = curl_init();
curl_setopt($creq, CURLOPT_URL, $row['kunden_website']);
curl_exec($creq);

if (curl_errno($creq)) {
    print curl_error($creq);
} else {
    curl_close($creq);
}
```

Das habe ich jetzt!.. er zeigt mir bei erreichbaren sind .. die Bilder!.. und bei nicht erreichbaren seiten steht CONFIXX und da drunter "nicht erreichbar.. " Ich möchte das es in eine $var gespeichert wird damit ich das im Template darstellen kann via ONLINE OFFLINE also TXT^^

Mfg..Hangrefer


----------

