Probleme beim lesen/schreiben mit fsockopen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Probleme beim lesen/schreiben mit fsockopen

    Hi,

    ich habe ein Problem beim lesen oder schreiben (ich weiß nicht genau wobei der Fehler auftritt) von Daten.

    Ich benutze einen kleinen Linux Rechner für die Heimautomation (HM CCU). Von außen übergebe ich die notwendigen Daten an den Rechner mit folgendem Code:

    PHP-Code:
    function Post_Request ($sdata)
    {
     
    $fp fsockopen ("127.0.0.1"8181$errno$errstr30);
     
     if (!
    $fp
         echo 
    "$errstr ($errno)<br />\n";
     else 
        {
              
    $st "POST /tclrega.exe HTTP/1.1\r\n";
              
    $st $st "Content-type: application/x-www-form-urlencoded\r\n";
              
    $st $st "Connection: Close\r\n";
              
    $st $st "Content-length: "strlen($sdata) ."\r\n\r\n";
              
          
    fputs($fp,$st.$sdata); 
          
    $st "";
          
    $t fgets($fp,500);
          
    $st $st $t "\r\n";
          
           while (
    $t != "\r\n"
           {
            
    $t fgets($fp,500);
           }
          
    $t "";

          while (!
    feof($fp))
            {      
             
    $t .= fgets($fp,10000);
            }

        
    fclose($fp);
      }

      
    $xml = new SimpleXMLElement($t);
      return 
    $xml->result

    Das klappt auch wunderbar. Aber nach einiger Zeit (das können 1 h oder auch 2 Tage sein) reagiert die CCU nicht mehr. Ich kann dann nichts mehr machen und muss den Resetknopf drücken.

    Ich muss dazu sagen, dieses Script wird regelmäßig von fünf Rechnern, die jeweils als Fernbedienung dienen aufgerufen.

    Ich vermute dass hier der Fehler zu finden ist, dass einfach zu viele Verbindungen bestehen.

    Wie kann ich das verhindern? Ich suche nach einer Möglichkeit, das dieses Script korrekt abbricht und die Resourcen wieder freigibt, wenn gerade kein Zugriff möglich ist, damit spätere Zugriffe wieder korrekt funktionieren und die CCU nicht mehr einfriert.

    Ciao, Chr.

  • #2
    Guten Morgen,
    ich kenne mich mit HM CCU jetzt nicht aus, aber kannst du die Daten die du brauchst nicht auch über die CMD an die tclrega.exe weitergeben, als Parameter a lá cmd> tclrega.exe -data1=bla -data2=blubblub ?

    Wenn ja kannst du es ja z.B. mit der PHP-Funktion PHP: exec - Manual probieren, oder den anderen Funktionen die PHP zum Starten von Programmen anbietet. Dann musste keinen Socket aufmachen.

    Gruß

    Björn

    Kommentar


    • #3
      Hi,

      tclrega.exe kenne ich leider nicht. Ich weiß wohl, dass ich auf der CCU auch tcl-Skripte ausführen lassen kann.

      Allerdings ergibt sich hier ein neues Problem. Im Code hatte ich zwar 127.0.0.1 angegeben, aber in wirklichkeit liegt der PHP-Server auf einem anderen Rechner. PHP greift über die korrekte IP-Adresse auf die CCU zu. Ein tcl-Skript kann ich so aber nicht auf der CCU starten.

      Übrigens die CCU ist ein normaler Linuxrechner, nur halt besonders leistungsschwach. Deshalb läuft der PHP-Server auch auf einem anderen Rechner.

      Ich habe jetzt erst mal folgenden Code eingefügt, wenn fsockopen korrekt geklappt hat.
      PHP-Code:
      stream_set_blocking  $fp  );
      usleep(300); 
      Dann habe ich nochmal ein usleep(300) zwischen lesen und schreiben eingebaut.

      Ob es was bringt weiss ich nicht. Das wird gerade getestet. Eigentlich sollte nach dem öffnen der Stream im Blocking Mode arbeiten.

      So ganz verstehe ich stream_set_blocking aber auch nicht. Oder muss der Blocking Mode besser abgeschaltet werden?

      Oder kann ich mit stream_select() den Fehler abfangen, dass die Daten einfach nicht ankommen wollen?

      Ciao, Chr

      Kommentar


      • #4
        Deine Header sind nicht HTTP 1.1 konform. Es wird mindestens noch ein Host Header erwartet. Warum verwendest du nicht cURL, Snoopy oder irgendwas anderes vorgefertigtes?
        Das Rad wird auch nicht runder davon, wenn man es dauernd neu erfindet.
        Wir werden alle sterben

        Kommentar


        • #5
          Also ich glaube, das es mit php nichts zutun hat.
          Du sagst doch, dass du CCU neustarten muss und nicht der Rechner, der Request sendet.
          Gibt es eine möglichkeit fehler-protocol von Homematic anzuschauen?
          Frage das bitte in jedem fall bei:
          ELV Elektronik AG, 26787 Leer
          Telefon: 0491/6008-245
          Fax: 0491/6008-457
          E-Mail: technik@elv.de
          Slava
          bituniverse.com

          Kommentar


          • #6
            Hi,
            Zitat von combie Beitrag anzeigen
            Deine Header sind nicht HTTP 1.1 konform. Es wird mindestens noch ein Host Header erwartet.
            kannst Du mir sagen, wie der aussehen könnte?

            Zitat von combie Beitrag anzeigen
            Warum verwendest du nicht cURL, Snoopy oder irgendwas anderes vorgefertigtes?
            Würde ich gerne, wenn ich die leiseste Ahnung hätte, was in der Funktion Post_Request genau passiert. Leider hat php.info im Moment Probleme, so dass ich nur an wenige und dann auch nur englische Informationen komme.

            Ich habe mir die Funktion noch mal genau angeschaut. So wie ich das jetzt verstehe wird durch fsockopen das Programm tclrega.exe gestartet. Danach wird dann die Ausgabe des Programms ausgelesen.

            Jetzt verstehe ich auch was mkb_webprint meinte. Was mir jetzt noch nicht klar ist, wie ich per cURL an die Daten kommen soll. Ich dachte, damit kann man nur normale Webseiten öffnen, aber Programme starten? Ich werde mir gleich mal die Anleitung zu cURL anschauen.

            Zitat von combie Beitrag anzeigen
            Das Rad wird auch nicht runder davon, wenn man es dauernd neu erfindet.
            Eben, genau deshalb benutze ich die Funktion. Ich habe einen PHP-Server auf der CCU installiert. Bei dem Server waren auch einige Beispielseiten. In diesen Beispielseiten wurde auf die einzelnen Geräte über die Funktion Post_Request zugegriffen. Da es damit funktionierte (mehr oder weniger) habe ich die Funktion einfach übernommen.

            Ciao, Chr.

            Kommentar


            • #7
              Hi,
              Zitat von Slava Beitrag anzeigen
              Also ich glaube, das es mit php nichts zutun hat.
              Du sagst doch, dass du CCU neustarten muss und nicht der Rechner, der Request sendet.
              ja, das denke ich jetzt auch. Ich hatte erst auf der CCU PHP installiert. Und da traten halt die Probleme des einfrierrens auf. Deshalb habe ich dann PHP vom Windowsrechner aus benutzt. Aber auch hier passiert das selbe. Die CCU friert ein.

              Zitat von Slava Beitrag anzeigen
              Gibt es eine möglichkeit fehler-protocol von Homematic anzuschauen?
              Ich hoffe, werde gleich mal im entsprechenden Forum nachfragen. Bei ELV oder eQ3 frage ich inzwischen nicht mehr nach. Die Arbeit kann man sich sparen. Auf E-Mails reagieren die nicht. Anrufen bringt leider nichts, da die Mitarbeiter bei so speziellen Fragen keine Antwort parat haben.

              Aber ich denke so langsam komme ich dem Problem näher. Ich denke, die Geräte müssen auch nicht immer nacheinander abgefragt werden. Wenn ich 30 Stati abfrage, dann wird ja 30 mal tclrega.exe gestartet. Das das bei der leistungsschwachen CCU zu Problemen führt ist eigentlich klar. Wahrscheinlich kann ich aber auch ein Skript starten dass dann einmal tclrega startet und alle erforderlichen Daten liefert.

              Ciao, Chr.

              Kommentar


              • #8
                @Chr_PHP_04 Das Forum bietet dir die Möglichkeit, mehrere Beiträge zu zitieren. Das ist schöner, als auf mehrere Posts verteilt zu antworten. Versuchs das nächste mal bitte.
                [FONT="Helvetica"]twitter.com/unset[/FONT]

                Shitstorm Podcast – Wöchentliches Auskotzen

                Kommentar

                Lädt...
                X