2012-03-31 6 views
8

В последнее время я работаю над созданием TCP-сервера с использованием PHP (с самого начала я знаю неправильный выбор, но это стандартный стандарт), поэтому я достиг точки, в которой есть надежный прототип для тестирования на нем, и он показал хорошие результаты. в начале я использовал функции сокетов для обработки соединения для сервера, и он работал хорошо, но одна из главных вещей в проекте - сделать канал защищенным, поэтому я переключился на stream_socket.Как узнать, когда соединение сбрасывается сверстником в php?

То, что я хочу, является эквивалентом socket_last_error в группе stream_socket, поэтому я могу знать, когда соединение с клиентом закрыто или нет. в текущей ситуации все процессы будут ждать тайм-аута таймера, чтобы освободить даже клиент уже закрыт.

Я искал сеть, и я обнаружил, что нет способа понять это через PHP, и я обнаружил, что некоторые люди открыли билет с запросом об этом, запрашивая эквивалент socket_last_error для потока. https://bugs.php.net/bug.php?id=34380

так что все равно знать, когда возникает сигнал FIN_WAIT или нет?

Спасибо,

ответ

1

Я не думаю, что это возможно stream_socket семья, похоже, это слишком высокий уровень.

Я попытался сделать очень хак решение, я не знаю, если это будет работать для вас, это не очень надежно:

<?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

Выход сервера:

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

Спасибо Янусу за ответ, но. как вы знаете, не представляется возможным помешать потоку, отправив некоторые данные, чтобы увидеть, когда он сломан или нет, и текущая ситуация заключается в том, что сервер ждет действий клиента, так что, как я предположил, я не думаю, что это возможно? – user1304594