2012-03-31 2 views
8

Ich habe in letzter Zeit am Aufbau eines TCP-Servers mit PHP gearbeitet (ich kenne eine falsche Wahl, aber das ist der Arbeitsstandard), also habe ich einen Punkt erreicht, an dem es einen zuverlässigen Prototyp gibt, der Tests durchführt gute Ergebnisse. Am Anfang habe ich Socket-Funktionen verwendet, um die Verbindung für den Server zu handhaben, und es funktionierte gut, aber eines der wichtigsten Dinge am Projekt ist es, den Kanal zu sichern, so dass ich zu stream_socket wechselte.Wie kann man wissen, wann die Verbindung von Peer in PHP zurückgesetzt wird?

was ich will ist ein socket_last_error gleichwertig in stream_socket Gruppe, so dass ich weiß, wann immer die Verbindung mit Client geschlossen ist oder nicht. In der aktuellen Situation warten alle Prozesse auf die Freigabe des Timeout-Timers, auch wenn der Client bereits geschlossen ist.

Ich habe das Netz gesucht und ich habe festgestellt, dass es keine Möglichkeit gibt, es durch PHP herauszufinden, und ich habe festgestellt, dass einige Leute Problem Ticket über es für socket_last_error Äquivalent für Stream geöffnet. https://bugs.php.net/bug.php?id=34380

Also ist es sowieso zu wissen, wann immer FIN_WAIT Signal ausgelöst wird oder nicht?

Danke,

Antwort

1

Ich glaube nicht, es ist möglich, die stream_socket Familie, es sieht aus wie es zu hohem Niveau ist.

Ich habe versucht, eine sehr hackish Lösung zu machen, ich weiß nicht, ob es für Sie funktioniert, dann ist es nicht sehr zuverlässig:

<?php 
set_error_handler('my_error_handler'); 

function my_error_handler($no,$str,$file,$line) { 
    throw new ErrorException($str,$no,0,$file,$line); 
} 

$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr); 
if (!$socket) { 
    echo "$errstr ($errno)\n"; 
} else { 
    while ($conn = stream_socket_accept($socket)) { 
    foreach (str_split('The local time is ' . date('n/j/Y g:i a') . "\n") as $char) { 
     echo $char; 
     try { 
      fwrite($conn,$char); 
     } catch (ErrorException $e) { 
      if (preg_match("/^fwrite\(\): send of 1 bytes failed with errno=([0-9]+) ([A-Za-z \/]+)$/",$e->getMessage(), $matches)) { 
        list($errno,$errstr) = array((int) $matches[1], $matches[2]); 
        if ($errno === 32) { 
          echo "\n[ERROR] $errstr"; // Broken pipe 
        } 
      } 
      echo "\n[ERROR] Couldn't write more on $conn"; 
      break; 
     } 
     fflush($conn); 
    } 
    fclose($conn); 
    } 
    fclose($socket); 
} 
echo "\n"; 
?> 

Launch: php ./server.php

Connect: nc localhost 8000 | head -c1

Server-Ausgabe:

The loca 
[ERROR] Broken pipe 
[ERROR] Couldn't write more on Resource id #6 
+0

Vielen Dank Janus für die Antwort aber. Wie Sie wissen, ist es nicht machbar, den Stream zu stören, indem Sie einige Daten senden, um zu sehen, wann immer es kaputt ist oder nicht. Auch die aktuelle Situation ist, dass der Server auf Clientaktionen wartet, also mit dem, was Sie vorgeschlagen haben, halte ich das nicht für machbar. – user1304594

Verwandte Themen