stream_socket_client | EOF verhindern bzw den connection lost vom stream.

  • PHP

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von xChRoNiKx.

    stream_socket_client | EOF verhindern bzw den connection lost vom stream.

    Hallo,
    ich weiß nicht ganze genau wie ich mein Problem beschreiben soll.
    Arbeite zurzeit an einem kleinem Teamspeak³ Bot. ( Ist erlaubt und verstößt gegen keine Nutzungsbedingungen )
    Dieser geht halt per Telnet auf den Server , loggt sich ein und registriert Events.
    Soweit so gut das läuft super. Das Problem ist nun allerdings das die "while" Schleife nach ca. 1-2 Stunden immer
    verlassen wird weil "EOF ( End of File )" erreicht wird.
    Hier mal der Code mit der Verbindung :

    PHP-Quellcode

    1. $tsFP = stream_socket_client("tcp://". $ip. ":". $tcpport , $errno, $errstr, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT);
    2. logToFile('[INFO] TS3-Bot started try to Connect....');
    3. if (!$tsFP) {
    4. logToFile("ERROR - MESSAGE:". $errstr . " - ". $errno);
    5. } else {
    6. stream_set_blocking ( $tsFP , true );
    7. $keepAliveTime = time();
    8. while (true ) {
    9. // Hier habe ich zurzeit noch Reconnect drin das er dann selbstständig nach dem EOF
    10. // neu verbindet aber das möchte ich ja eigentlich nicht haben
    11. while (!feof($tsFP)) { // Um das hier geht es mir an sich. Hier wird halt EOF erreicht.
    12. $result = fgets($tsFP, 2048);
    13. $keepAliveDiff = time() - $keepAliveTime;
    14. if ( $keepAliveDiff > 180 ) {
    15. logToFile("[TIMEINFO] - KeepAliveTriggered");
    16. $keepAliveTime = time();
    17. fwrite($tsFP, "\r\n");
    18. }
    19. if ($result != "") {
    20. }
    21. }
    22. logToFile("[INFO] END OF FILE WHILE");
    23. }
    24. }


    Habe mal das ganze geparse rausgelassen weil das ja ganz normal funktioniert.
    Ich habe halt einfach immer wieder "[INFO] END OF FILE WHILE" im Log stehen -
    und das passiert dann mit einem connection lost. Ich möchte aber das er
    immer verbunden bleibt. Deshalb dachte ich das ganze wäre mit einem kleinen Trigger
    getan der halt alle 3 Minuten etwas in den Stream schreibt aber selbst das Hilft nicht.

    Die Frage ist wie bekomme ich das hin den "EOF" naja zu umgehen das er dabei nicht neu verbinden muss ?
    Funktionieren muss das irgendwie weil das andere Bots ja auch können und Streams sind ja soweit ich weiß
    eigentlich überall gleich ?

    Falls da jemand eine Ahnung hat wäre ich für den Tipp des Jahrhunderts sehr dankbar.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Huhu,
    das Script wird per CMD ausgeführt. Dabei wird die Max Execution Time immer auf unlimited gestellt.
    Der Socket Timeout ist auch unlimited es ist halt wirklich nur dieses EOF weswegen er die ganze Zeit
    abbricht und dann muss ich natürlich neuverbinden. Und genau das möchte ich unterdrücken.
    Wie gesagt gehen muss das irgendwie denn es gibt ja auch andere Bots die auch dauer laufen ohne Reconnect.
    Nur weiß ich nicht wie.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Heyho,
    welche letzten 5 Zeilen ? Wenn du die vom Script meinst
    ist da nichts weiter nur ein fclose($tsFP); für den Command Exit / Restart und der wird nicht aufgerufen
    wenn EOF erreicht wird zum testen ob er einfach verbunden bleibt was aber auch nicht der fall ist.
    Ansonsten close ich die ganze Zeit und lass dann reconnecten.

    Im TS Log steht nichts weiter nur der connection lost was ja auf den EOF zurückzuführen ist.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    In Zeile 18 liest du Daten, die meinte ich.
    feof gibt auch true zurück wenn ein Fehler auftritt (wie zb. Zeitüberschreitung), steht irgendetwas im PHP Errorlog?
    Huhu,
    ja Zeile 18 wird halt der output gelesen den mir der TS³-Serverquery gibt wenn irgendwas passiert.
    In Zeile 25 wird ja dann $result behandelt wenn nicht leer dann wird halt geprüft
    was der Server mir schickt ( ob jemand den Server verlassen oder betreten hat oder ob der QueryClient eine Textmessage bekommen hat)

    Im PHP Errorlog steht auch nichts.
    Kann ich denn irgendwie herrausfinden warum er EOF schmeißt ? Also ob es wirklich "End of File" ist oder eine Zeitüberschreitung ?
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    xChRoNiKx schrieb:

    $result = fgets($tsFP, 2048);

    Kann es sein, das an dieser Stelle zu wenig Daten vom Server geliefert werden, und dieser daher in den Status EOF geht? Vielleicht mal die Länge von $result mitloggen, und nach dem EOF-Ausstieg untersuchen.
    Dann müsste er ja zwischenzeitlich immer wieder die Verbindung verlieren weil
    $result eigentlich solange kein Event gefeuert wird leer ist.

    Werde aber die $result länge mit den in Log packen wenn er mal wieder EOF feuert denke aber mal das es daran nicht liegen kann.
    Nur da kann ich erst später auskunft zu geben weil ich darauf warten muss das EOF passiert ( 1- 2 Stunden ca. ).

    EDIT// @us4711
    Wie erwartet ist $result length = 0

    Quellcode

    1. [2017/03/24 12:49:17] [DEBUGINFO] Result length: 0
    2. [2017/03/24 12:49:17] [DEBUGINFO] Result Content:

    Wüsste aber nun nicht das es daran liegen könnte weil wie gesagt es ist die meiste Zeit 0.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xChRoNiKx“ ()

    Huhu,
    ich nochmal. Also er kommt immer wieder in den EOF.
    Hat da noch jemand eine Idee an was das liegen könnte oder wie
    ich das umgehen kann ?

    EDIT//
    @us4711
    ich habe mal noch "stream_get_meta_data" ( PHP Manual Link ) ausgelesen wenn er aussteigt:

    Quellcode

    1. [2017/03/25 10:58:27] [STREAM_METE_DATA] timed_out:
    2. [2017/03/25 10:58:27] [STREAM_METE_DATA] blocked: 1
    3. [2017/03/25 10:58:27] [STREAM_METE_DATA] eof: 1
    4. [2017/03/25 10:58:27] [STREAM_METE_DATA] stream_type: tcp_socket/ssl
    5. [2017/03/25 10:58:27] [STREAM_METE_DATA] mode: r+
    6. [2017/03/25 10:58:27] [STREAM_METE_DATA] unread_bytes: 0
    7. [2017/03/25 10:58:27] [STREAM_METE_DATA] seekable:

    Es ist also definitiv ein EOF. Kann man den umgehen ohne Reconnect ? Per google finde ich leider
    nichts entsprechendes.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xChRoNiKx“ ()

    Siehe meinen letzten Post -
    Hier noch irgendjemand eine Idee ? Das "Problem" ist immer noch nicht gelöst.
    Alle Infos die ich bekommen kann stehen quasi im Thread.
    Auch wenn ich ungerne Personen "verlinke" ^^
    Hast du @Link villt eine Idee ?
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen