Heizer: Zeitlimit für funktion

Guten Morgen zusammen!

Ich hätte da wieder mal was:
Ich frage auf einer Seite, auf der man seine Homepage eintragen kann, per fopen() ab, o dieser existiert bzw. erreichbar ist. Das klappt auch wunderbar, lokal mit internetverbindung über ISDN verzögert sich der seitenaufbau nur um 2-3 Sekunden, was ich tollerieren kann. Aber nur solange es die Seite gibt. wenn sie nicht existiert, dauert es teilweise über zwanzig sekunden, bis die Seite weiter aufgebaut wird. Und das sieht _sehr_ unschön aus.
Jetzt meine Frage: gibt es eine Möglichkeit, einer Funktion nur eine bestimmte Zeitspanne zur Verfügung zu stellen? Ich habe in diesem Zusammenhang nur set_time_limit() gefunden, das aber eine Fehlermeldung produziert, wenn die Zeit überschritten wird. Das ist nicht unbedingt ein Fortschritt ;-)

Ich hab mir auch schon eine Ausweichmöglichkeit zurechtgedacht, über Javascript die seite solange verstecken und eine "Bitte warten..." Meldung anzeigen, aber schöner fände ich die andere Lösung.

weiß jemand Rat?

Danke

Heizer

  1. keine ahnung.. aber mich würde der quellcode des programms allgemein interessieren... kann ich den haben? thx

    TOM

    1. keine ahnung.. aber mich würde der quellcode des programms allgemein interessieren... kann ich den haben?

      $homepage ist die Per Formular übergebene eingabe des Besuchers

      <?
      if ($homepage)
        $homepage = eregí_replace("http://","",$homepage); // http:// wegschneiden wenn vorhanden, um auf einheitliche Form zu kommen
        if (!fopen("http://$homepage",r) { // Versuch, die adresse zu öffnen über HTTP Verbindung
          echo "Die Homepage ist nicht erreichbar"; // wenn nicht geöffnet werden kann
          }
        else { // wenn geöfnet werden kann
          // in MySQL eintragen
          }
      ?>

  2. Hi!
    warum sollte es daran liegen, wenn die Datei nicht existiert geht doch eigentlich schneller rauszufinden, als die Datei zu öffnen, oder?
    Hab was ähnliches mal gemacht, zwar keine wunderschöne Lösung, aber es ging, war aber eine Schleife.
    Hab erst mit $start = time(); den Unix Timestamp für den Start geholt, und dann bei jedem duchgang gefragt ob time() - 10 < $start, dann abgebrochen, dann lief die Schleife 10 Sekunden.
    Weiß aber nicht ob es Dir was bringt!
    Grüße
    Andreas

  3. Ich frage auf einer Seite, auf der man seine Homepage eintragen kann, per fopen() ab, o dieser existiert bzw. erreichbar ist. Das klappt auch wunderbar, lokal mit internetverbindung über ISDN verzögert sich der seitenaufbau nur um 2-3 Sekunden, was ich tollerieren kann. Aber nur solange es die Seite gibt. wenn sie nicht existiert, dauert es teilweise über zwanzig sekunden, bis die Seite weiter aufgebaut wird. Und das sieht _sehr_ unschön aus.
    Jetzt meine Frage: gibt es eine Möglichkeit, einer Funktion nur eine bestimmte Zeitspanne zur Verfügung zu stellen?

    Für eine nicht-existierende Homepage-Adresse gibt es drei Möglichkeiten:

    1. Die Datei existiert nicht auf dem angegebenen Server.
    2. Auf dem Server läuft kein Webserver, oder er ist blockiert.
    2. Der Server, besser: die Domain, ist unbekannt.

    In ersterem Fall solltest Du eigentlich sofort eine Antwort bekommen, der Server ist ja da und kann dementsprechend eine Fehlermeldung ausspucken.

    Im zweiten Fall und dritten Fall kann es dauern.

    fopen() selber bietet keine Möglichkeit, ein Zeitlimit anzugeben, da diese Funktion eine Dateisystemfunktion ist und dementsprechend eher nicht davon ausgegangen wird, daß es eine halbe Minute dauert, bis eine Datei gefunden ist. Solange braucht nichtmal eine gute, alte Diskette.

    Damit kommst Du also nicht weiter, Du musst Dich schon etwas tiefer in's System begeben, zu den Netzwerk-Funktionen. Und da findest Du dann auch bei der Funktion fsockopen() die Möglichkeit, ein Zeitlimit anzugeben.
    Der Nachteil ist allerdings, daß Du dich ein wenig mit dem HTTP-Protokoll (ganz wenig) beschäftigen musst. Das ist aber nicht allzu schwer:

    Um rauszufinden, ob eine angegebene Datei existiert, schickst Du

    HEAD http://tolle.doma.in/noch/bessere/seite.html HTTP/1.0\r\n\r\n

    an den Server und der antwortet dann entweder mit

    HTTP/1.1 200 OK

    und einem Bandwurm an Informationen über die angefragte Datei oder mit dem berühmt-berüchtigten

    HTTP/1.1 404 Not found

    oder einem anderen Fehler.

    Das Codebeispiel in der PHP-Anleitung unter fsockopen() ist nicht ganz richtig, so sollte es funktionieren und Dir den angesprochenen Bandwurm ausspucken:

    <html><body><pre>
    <?php
    $fp = fsockopen("www.php.net", 80, $errno, $errstr, 30);
    /*
    Adresse www.php.net, Port 80 (http, dort wo der Webserver wartet), 30 Sekunden Limit
    */
    if (!$fp)
      {
        echo "$errstr ($errno)<br>\n";
      }
     else
      {
        fputs($fp, "HEAD http://www.php.net/ HTTP/1.0\r\n\r\n");
        while (!feof($fp))
         {
            echo htmlentities(fgets($fp,1024));
         };
        fclose($fp);
      };
    ?>
    </pre></body></html>

    Man beachte, daß der einzige Unterschied zwischen Dateisystem- und Netzwerkfunktionen der Austausch von fopen() durch fsockopen() ist (und das Bearbeiten des Protokolls natürlich).

    Ich habe in dem Beispiel außerdem das GET durch HEAD ersetzt. Mit GET sendet der Server Dir erst Informationen über die Datei und dann die komplette Datei selber, mit HEAD erhälst Du nur die Informationen (und mehr wolltest Du ja nicht).
    Probier's einfach mal und ersetze HEAD wieder durch GET.

    Gruß,
      soenk.e

    1. Hi Sönke

      fopen() selber bietet keine Möglichkeit, ein Zeitlimit anzugeben, da diese Funktion eine Dateisystemfunktion ist und dementsprechend eher nicht davon ausgegangen wird, daß es eine halbe Minute dauert, bis eine Datei gefunden ist. Solange braucht nichtmal eine gute, alte Diskette.

      Du musst Dich schon etwas tiefer in's System begeben, zu den Netzwerk-Funktionen. Und da findest Du dann auch bei der Funktion fsockopen() die Möglichkeit, ein Zeitlimit anzugeben.
      Der Nachteil ist allerdings, daß Du dich ein wenig mit dem HTTP-Protokoll (ganz wenig) beschäftigen musst.

      Oh, Gott, wieder ein Teil von PHP, von dem ich bis jetzt aus Respektgründen die Finger gelassen habe (der letzte war der XML-Parser), aber gut, vielen Dank für deine Ausführliche Antwort, daß ist mehr als ich zu hoffen wagte, und ich werde mich dieses WE mal in die Socket-Funktionen einarbeiten (bin gespannt, wielange es noch dauert, bis alle Links meines PHP-Manual als besucht gekennzeichnet sind ;-))

      Nochmal vielen Dank

      Heizer

      1. Du musst Dich schon etwas tiefer in's System begeben, zu den Netzwerk-Funktionen. Und da findest Du dann auch bei der Funktion fsockopen() die Möglichkeit, ein Zeitlimit anzugeben.

        Oh, Gott, wieder ein Teil von PHP, von dem ich bis jetzt aus Respektgründen die Finger gelassen habe (der letzte war der XML-Parser),

        Du hast den wichtigsten Absatz übersehen:

        "Man beachte, daß der einzige Unterschied zwischen Dateisystem- und Netzwerkfunktionen der Austausch von fopen() durch fsockopen() ist"

        Und eine Zeile irgendwo reinschreiben und dann eine rauslesen ist nicht so fürchterlich doll schwer :)

        Gruß,
          soenk.e