flip: fgets überschreitet die Zeit

Hallo liebe Gemeinde,

$fp = fsockopen($host, 80);

if(!$fp)
echo "failed";
else
echo "connected";

$text = fputs($fp, "GET $path HTTP/1.1\r\n");
$_hol = fgets($fp, 128);         // auf dieser Zeile wird mir die Fehlermeldung ausgegeben.

Fatal error: Maximum execution time of 30 seconds exceeded in C:\Apache2\****\*****\****.php on line 53

echo $_hol;

fclose($fp);

also die öffnung klappt soweit, aber bei fgets läuft wohl irgendwas schief..

mbg flip

  1. Hallo flip,

    $text = fputs($fp, "GET $path HTTP/1.1\r\n");
    $_hol = fgets($fp, 128);

    Warum sollte der Server dir auch antworten, wenn du deinen Request noch nicht vollständig gesendet und beendet hast..?
    Das Host-Feld ist im HTTP-1.1-Request notwendig. Zudem muss der Request durch ein doppeltes \r\n beendet werden..

    Grüße
      David

    --
    >>Nobody will ever need more than 640k RAM!<<
    1981 Bill Gates
    1. hallo David und co,

      danke für die tipps, aber was heisst eigentlich /r/n ?

      mbg flip

      1. hi,

        $text = fputs($fp, "GET $path HTTP/1.1\r\n");
        fputs($fp, "Host: $host\r\n");
        fputs($fp, "Connection: close\r\n\r\n");
        $_hol = fgets($fp, 128);
        echo $_hol;

        jetzt bekomm ich einen bad request.

        mbg flip

        1. Hallo,

          $text = fputs($fp, "GET $path HTTP/1.1\r\n");
          fputs($fp, "Host: $host\r\n");
          fputs($fp, "Connection: close\r\n\r\n");
          $_hol = fgets($fp, 128);
          echo $_hol;
          jetzt bekomm ich einen bad request.

          und was steht in $host und $path?
          Abgesehen davon: was stellst du noch mit $text an? Das erscheint mir weitgehend überflüssig.

          So long,
           Martin

          --
          Was du heute kannst besorgen,
          das geht sicher auch noch morgen.
          1. hi,

            $text = fputs($fp, "GET $path HTTP/1.1\r\n");
            fputs($fp, "Host: $host\r\n");
            fputs($fp, "Connection: close\r\n\r\n");
            $_hol = fgets($fp, 128);
            echo $_hol;
            jetzt bekomm ich einen bad request.

            HTTP/1.1 400 Bad Request / genau den bekomm ich

            und was steht in $host und $path?

            hab ich

            $host = 'localhost';
            $path = '*****/***.php';

            Abgesehen davon: was stellst du noch mit $text an? Das erscheint mir weitgehend überflüssig.

            stimmt wohl, is jetzt auch weg.

            mbg flip

            1. Ahoi flip ,

              fputs($fp, "Connection: close\r\n\r\n");

              wie wärs mit keep-alive?

              MfG

              1. Ahoi flip ,

                fputs($fp, "Connection: close\r\n\r\n");

                natürlich, hab ich gar nicht drauf geachtet, war aus einem beispiel rein kopiert...

                wie wärs mit keep-alive?

                eigentlich brauch ich zu diesem Zeitpunkt gar kein connection status angeben oder?

                ansonsten

                fputs($fp, "Connection: keep-alive\r\n\r\n"); / bad request 400

                und ohne die Zeile wieder timeout 30 seconds.

                mbg flip

                1. Klappt jetzt , 200 ok

                  ersten fputs natürlich nicht mit doppel /r/n abschliessen

                  welche close variante momentan noch egal klappt bei jeder oder beiden.

                  absoulter Pfad ist erforderlich sonst bad

                  danke soweit an alle werde jetzt weiter schauen.

                  bekomme also für $_hol ein 200 ok?

                  wie bekomm ich den string ,

                  mein nächster schritt ist es die seite einzulesen und nach bestimmten mustern und zeichenketten zu durchsuchen.

                  mbg flip

                  1. Ahoi flip,

                    Klappt jetzt , 200 ok

                    gut.

                    mein nächster schritt ist es die seite einzulesen und nach bestimmten mustern und zeichenketten zu durchsuchen.

                    fgets bis endOfFile dann hast du den kompletten response. Also Header + Requestete Datei.

                    MfG

                    1. hi,

                      fgets bis endOfFile dann hast du den kompletten response. Also Header + Requestete Datei.

                      while(!feof($fp))
                      {
                      $erg = fgets($fp);
                      echo $erg;
                      }

                      hat folgendes ergeben:

                      HTTP/1.1 200 OK Date: Wed, 01 Aug 2007 12:22:10 GMT Server: Apache/2.0.55 (Win32) Content-Length: 354 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html

                      schließe daraus das der timeout bei 15 liegt und maximal bis 100 geht.
                      falls ja , wie finde ich herraus wielange der request gedauert hat?

                      ansonsten bekomm ich unten noch das Formular ausgegen, aber nicht in html sondern als website.

                      möchte nun in $erg nach einer zeichenkette suchen, nämlich der <form.

                      also nach dem Formular um dort dann einen Namen und einen Nachnamen einzutragen.

                      Falls es eine bessere Variante gibt ein Formular ausfindig zu machen teilt es mir bitte mit.

                      mbg flip

                      1. Ahoi flip ,

                        while(!feof($fp))
                        {
                        $erg .= fgets($fp);

                        ^^^

                        }
                        echo $erg;

                        hat folgendes ergeben:

                        Das sieht doch schonmal ganz gut aus.

                        falls ja , wie finde ich herraus wielange der request gedauert hat?

                        $start = zeit In Milisekunden;
                        // tu was
                        $ende = zeit in milisekunden;
                        $dauer = $ende-$start; // in millisekunden

                        Datums und Zeitfunktionen von PHP

                        ansonsten bekomm ich unten noch das Formular ausgegen, aber nicht in html sondern als website.

                        ähm doch, weil in html eben als "Website". wenn du den code sehen willst nutze: htmlentities()

                        möchte nun in $erg nach einer zeichenkette suchen, nämlich der <form.

                        dazu benutz du dann die string-funktion strpos();

                        Um das ganze etwas enfacher handhaben zu können empfihlt sich aber evt. die verwendung eines Arrays:

                        while(!feof($fp))
                        {
                         $erg[]=fgets($fp);
                        }

                        MfG

                        1. Ahoi,

                          ok, aber wie trage ich etwas in ein Formular automatisch ein und schicke es dann ab?

                          geht das auch ohne value feld bei input?

                          <input name="Nachname" type="text" size="20">

                          mbg flip

                          1. Ahoi flip ,

                            ok, aber wie trage ich etwas in ein Formular automatisch ein und schicke es dann ab?

                            das klingt irgendwie böse,.. zumindest nach einem Bot-skript.

                            geht das auch ohne value feld bei input?

                            nein, value = Wert der übermittelt wird.

                            MfG

                            1. Ahoi,

                              ja das soll ein bot werden, aber er ist nicht böse.

                              Mit dem Bot sollen zunächst automatische Abfrgen und Einträge geleistet werden, kein spam bot oder ähnliches!

                              Wenn das input feld kein value hat, wie stell ich es dann an?

                              mbg flip

                              1. Ahoi flip ,

                                ja das soll ein bot werden, aber er ist nicht böse.

                                das heist das formular das er nutzt ist von dir?

                                Mit dem Bot sollen zunächst automatische Abfrgen und Einträge geleistet werden, kein spam bot oder ähnliches!

                                Nun, wenn er quasi auf dieses eine Forumular geeicht sit schau dir das doch einfach an, wenn es per get submitted wird dann mach eben das:

                                  
                                $http_request = "GET $form_acten?feld1=wert1&amp;feld2=wert2 HTTP/1.1\r\n";  
                                $http_request .= "Host: $host:80 \r\n";  
                                $http_request .= "Connection: keep-alive\r\n";  
                                $http_request .= "\r\n";  
                                $http_request .= "\r\n";  
                                fputs($fp, $http_request );  
                                
                                

                                MfG

                                1. Also er soll generell Formulare ausfüllen können post oder get.
                                  zunächst will ich aber mein eigenes ausfüllen und dabei schon mit dem shema anfangen, das er nach einem Formular sucht und daraufhin Werte abschickt!

                                  Ich mach kein Spam oder sonstwas!!!

                                  Ich werde verschiedne Sachen machen, auch Spiders möchte ich in Zukunft programmieren.

                                  Aber wiegesagt Spam oder irgendwelche Dummheiten sind nicht meine Kragenweite.

                                  Habe zunächst meinem Beispiel Formular value="" hinzugefügt.

                                  Würde es zwar auch gerne ohne Value schaffen aber für den Anfang muss es reichen.

                                  Ich bekomme so

                                  while(!feof($fp))
                                  {
                                  $erg = fgets($fp);
                                  //echo $erg;
                                  }
                                  $such = strpos($erg,'<form');
                                  echo $such;

                                  oder so

                                  while(!feof($fp))
                                  {
                                   $erg[]=fgets($fp);
                                  }

                                  $such = strpos($erg,'<form');
                                  echo $such;

                                  kein Ergebnis ausgegeben, aber auch kein Fehler!

                                  Es gibt doch sowas wo ich in den Quelltext was schreibe, für Variablenausgabe und im Seitenquelltext über den Browser werden mir dann die Inhalte ausgegeben?! Weist du viel. was ich meine?

                                  mbg flip

                                  1. Hallo,

                                    Also er soll generell Formulare ausfüllen können post oder get.

                                    und dann abschicken?
                                    Okay, dann bleibt dir nichts anderes übrig, als das Formular selbst zu parsen. Wenn das Dokument mit dem Formular immer valides XHTML wäre, könnte man ja einen XML-Parser darauf loslassen, etwa simplexml. Aber da HTML so fehlertolerant ist und so viele Schlampereien zulässt (und manche Autoren sogar noch schlampiger sind als eigentlich erlaubt), wirst du selbst eine Funktion schreiben müssen, die HTML-Tags und deren Attribute isoliert.

                                    Suche und isoliere dazu erst das form-Element und extrahiere seine Attribute action und method. Sollte action leer sein, ersetze es durch die URL des Dokuments, das du gerade untersuchst; sollte method fehlen, nimm 'GET' als Default.
                                    Wandere dann durch das Formular und suche alle Elemente vom Typ input, select und textarea. Untersuche ihre Attribute, denn du musst bei jedem ein bisserl anders reagieren: Das name-Attribut brauchst du von allen, aber während <input type="text"> und <textarea> beliebigen Text erlauben (deswegen kannst du deren value-Attribut getrost ignorieren oder höchstens als Defaultwert nehmen), sollten für <select> nur Werte übermittelt werden, die auch als option zur Verfügung stehen. Radiobuttons und Checkboxen sind wieder etwas anders zu behandeln, hier ist deren value zu beachten; und wenn du mehrere <input type="submit"> findest, solltest du auch nur einen davon übermitteln (oder gar keinen).
                                    Definiere nun für jedes gefundene Elemente den Wert, den du übertragen möchtest.

                                    Baue schließlich den kompletten Query-String zusammen, indem du alle zuvor ermittelten name/value-Pärchen verkettest:
                                     name1=value1&name2=value2&name3=value3&usw.

                                    Setze endlich einen weiteren Request ab. Für die GET-Methode nimmst du die action-URL, hängst ein Fragezeichen und den Query-String dran und überträgst das als Namen der angeforderten Ressource. Für POST trägst du _nur_ die action-URL als Request URL in den Header ein und versendest den Query-String als Request Body.

                                    Ich habe das jetzt bewusst recht oberflächlich beschrieben, aber du siehst schon jetzt: Das ist immens viel Aufwand, vor allem wenn man in der Materie noch nicht sattelfest ist. Ich vermute, du hast dich mit dem Vorhaben etwas übernommen.

                                    Ich mach kein Spam oder sonstwas!!!

                                    Das will ich auch hoffen! ;-)

                                    Habe zunächst meinem Beispiel Formular value="" hinzugefügt.

                                    Wozu? Und bei welchen Elementen?

                                    Ich bekomme so

                                    while(!feof($fp))
                                    {
                                    $erg = fgets($fp);
                                    //echo $erg;
                                    }
                                    $such = strpos($erg,'<form');

                                    oder so

                                    while(!feof($fp))
                                    {
                                    $erg[]=fgets($fp);
                                    }
                                    $such = strpos($erg,'<form');

                                    kein Ergebnis ausgegeben, aber auch kein Fehler!

                                    Das glaube ich nicht. In der ersten Variante müsste $such einen positiven Zahlenwert ergeben, nämlich die Position des <form>-Tags innerhalb des Strings. Im zweiten Fall solltest du eine Fehlermeldung kassieren, weil strpos kein Array als ersten Parameter haben will.

                                    Es gibt doch sowas wo ich in den Quelltext was schreibe, für Variablenausgabe und im Seitenquelltext über den Browser werden mir dann die Inhalte ausgegeben?!

                                    Hä?

                                    So long,
                                     Martin

                                    --
                                    Wichtig ist, was hinten rauskommt.
                                      (Helmut Kohl, 16 Jahre deutsche Bundesbirne)
                                    1. Hallo,

                                      Also er soll generell Formulare ausfüllen können post oder get.

                                      und dann abschicken?

                                      Ja

                                      Okay, dann bleibt dir nichts anderes übrig, als das Formular selbst zu parsen. Wenn das Dokument mit dem Formular immer valides XHTML wäre, könnte man ja einen XML-Parser darauf loslassen, etwa simplexml. Aber da HTML so fehlertolerant ist und so viele Schlampereien zulässt (und manche Autoren sogar noch schlampiger sind als eigentlich erlaubt), wirst du selbst eine Funktion schreiben müssen, die HTML-Tags und deren Attribute isoliert.

                                      Suche und isoliere dazu erst das form-Element und extrahiere seine Attribute action und method. Sollte action leer sein, ersetze es durch die URL des Dokuments, das du gerade untersuchst; sollte method fehlen, nimm 'GET' als Default.
                                      Wandere dann durch das Formular und suche alle Elemente vom Typ input, select und textarea. Untersuche ihre Attribute, denn du musst bei jedem ein bisserl anders reagieren: Das name-Attribut brauchst du von allen, aber während <input type="text"> und <textarea> beliebigen Text erlauben (deswegen kannst du deren value-Attribut getrost ignorieren oder höchstens als Defaultwert nehmen), sollten für <select> nur Werte übermittelt werden, die auch als option zur Verfügung stehen. Radiobuttons und Checkboxen sind wieder etwas anders zu behandeln, hier ist deren value zu beachten; und wenn du mehrere <input type="submit"> findest, solltest du auch nur einen davon übermitteln (oder gar keinen).
                                      Definiere nun für jedes gefundene Elemente den Wert, den du übertragen möchtest.

                                      Baue schließlich den kompletten Query-String zusammen, indem du alle zuvor ermittelten name/value-Pärchen verkettest:
                                      name1=value1&name2=value2&name3=value3&usw.

                                      Setze endlich einen weiteren Request ab. Für die GET-Methode nimmst du die action-URL, hängst ein Fragezeichen und den Query-String dran und überträgst das als Namen der angeforderten Ressource. Für POST trägst du _nur_ die action-URL als Request URL in den Header ein und versendest den Query-String als Request Body.

                                      Ich habe das jetzt bewusst recht oberflächlich beschrieben, aber du siehst schon jetzt: Das ist immens viel Aufwand, vor allem wenn man in der Materie noch nicht sattelfest ist. Ich vermute, du hast dich mit dem Vorhaben etwas übernommen.

                                      Ich möchte gerne die Funktion selber schreiben, denke mit eurer Hilfe und besser reinkommen in die Materie kann ich das schaffen.
                                      Teilweise hat ich mir das schon so gedacht nur dachte ich man könnte die geparste Seite, über values ausfüllen und dann normal abschicken ohne den request zu konstruieren?

                                      Aber wenn es nur so geht, mach ich es so!

                                      Ehrlich gesagt hab ich richtig lust darauf, nur mann kennt sich halt noch nicht so aus.

                                      Habe zunächst meinem Beispiel Formular value="" hinzugefügt.

                                      Wozu? Und bei welchen Elementen?

                                      Naja ich möchte ja die Values füllen oder, und Daniel sagte wenn die nicht vorhanden sind klappt da was nicht.

                                      Halt so wie ich es angedacht hatte das ich die values halt fülle im Text usw.

                                      bei den input type text elementen.

                                      kein Ergebnis ausgegeben, aber auch kein Fehler!

                                      Das glaube ich nicht. In der ersten Variante müsste $such einen positiven Zahlenwert ergeben, nämlich die Position des <form>-Tags innerhalb des Strings. Im zweiten Fall solltest du eine Fehlermeldung kassieren, weil strpos kein Array als ersten Parameter haben will.

                                      while(!feof($fp))
                                      {
                                       $erg[]=fgets($fp);
                                      }
                                      foreach($erg as $value)
                                      {
                                       echo $value;
                                      }
                                      so klappt das wieder , ich bekomm dann Werte und das Formular.

                                      ich möchte jetzt halt $erg nach <form durchsuchen und dann halt damit anfangen was du oben beschrieben hast.

                                      Es gibt doch sowas wo ich in den Quelltext was schreibe, für Variablenausgabe und im Seitenquelltext über den Browser werden mir dann die Inhalte ausgegeben?!

                                      Hä?

                                      ja genau,

                                      also um es nochmal zu verdeutlichen, in deiner Entwicklungsumgebung gibts du echo $_GET oder vielleicht auch eine andere supervariable, aber das ergebnis oder einen bestimmten Teil davon siehst du dann nicht im Browser, sondern im Quelltext anzeigen vom Browser.

                                      So ein Lehrer von mir hat das öfters gemacht, um Fehlern auf die Schliche zu kommen.

                                      mbg flip

                                    2. Ahoi Der Martin,

                                      Es gibt doch sowas wo ich in den Quelltext was schreibe, für Variablenausgabe und im Seitenquelltext über den Browser werden mir dann die Inhalte ausgegeben?!
                                      Hä?

                                      ich tippe auf http://de3.php.net/manual/de/function.var-dump.php
                                      oder http://de3.php.net/manual/de/function.print-r.php

                                      zum durchsuchen eines arrays ($erg[]="xy"; erstellt eines) empfehlen
                                      sich die verwendungen von Array funktionen. http://de3.php.net/manual/de/ref.array.php
                                      z.B. http://de3.php.net/manual/de/function.array-search.php

                                      MfG

              2. echo $begrüßung;

                fputs($fp, "Connection: close\r\n\r\n");
                wie wärs mit keep-alive?

                Welchen Grund führst du für ein keep-alive an?
                Nach Abarbeiten eines PHP-Scripts werden alle geöffneten Ressourcen, also auch die Socket-Verbindung geschlossen. Ich sehe keinen Grund, sie offen lassen zu wollen, wenn sowieso kein zweiter Request darüber abgewickelt wird.

                echo "$verabschiedung $name";

            2. Hallo flip,

              $path = '*****/***.php';

              Die URIs müssen absolut sein, sprich frage nach /some/sub/folder/script.php

              Grüße
                David

              --
              >>Nobody will ever need more than 640k RAM!<<
              1981 Bill Gates
              1. Hallo David,

                was meinst du mit absoulut: ein / zu beginn oder soll ich den gesammten Pfad dort erneut eingeben. denke du meinst den slash

                $host = 'localhost';
                $path = '/*****/***.php'; //

                $fp = fsockopen($host, 80);

                if(!$fp)
                echo "failed";
                else
                echo "connected";

                fputs($fp, "GET $path HTTP/1.1\r\n\r\n");
                fputs($fp, "Host: $host\r\n");

                // fputs($fp, "Connection: keep-alive\r\n\r\n"); raus genommen aber mit oder ohne bad request.

                $_hol = fgets($fp, 128);
                echo $_hol;

                fputs($fp, "Connection: close\r\n\r\n");  / hab jetzt hier zwei close , ist das überhautp sinnvoll?

                fclose($fp); / muss ich im endeffekt über fclose abschliessen oder reicht es über fputs connection close s.o

                jede Variante brachte bad request..

                Wie ist bitte ein Gründlicher Request aufzubauen in dem mind. noch eine Anfrage an die URL gestellt wird?

                mbg flip

                1. Ahoi flip ,

                  $host = 'localhost';
                  $path = '/*****/***.php'; //
                  $fp = fsockopen($host, 80);

                  if(!$fp)
                  echo "failed";
                  else
                  echo "connected";

                  [code lang=php]
                  $http_request = "GET $path HTTP/1.1\r\n";
                  $http_request .= "Host: $host:80 \r\n";
                  $http_request .= "Connection: keep-alive\r\n";
                  $http_request .= "\r\n";
                  $http_request .= "\r\n";
                  fputs($fp, $http_request );
                  [code]

                  MfG

      2. Hallo flip,

        danke für die tipps, aber was heisst eigentlich /r/n ?

        Das sind escapte Zeichen, siehe Manual

        Grüße
          David

        --
        >>Nobody will ever need more than 640k RAM!<<
        1981 Bill Gates