Запись в сокет и обработка сломанных каналов

У меня есть код на PHP, который подключается к сокету. У меня периодически ломалась трубка, когда я писал ей. Проблемы, кажется, исчезнут, если снова написать в трубу. Мне интересно, что требуется (самый безопасный способ) для восстановления после этого. Мне также интересно, может ли socket_write вернуться без записи полной строки, которая была ему передана. Вот что у меня есть на данный момент.

function getSocket() {
  $socket = socket_create( AF_UNIX, SOCK_STREAM, 0 );
  if ( $socket === FALSE ) {
    throw new Exception(
      "socket_create failed: reason: " . socket_strerror( socket_last_error() ));
    }
  }

  $result = socket_connect($socket, $address);
  if ($result === false) {
    throw new Exception("socket_connect() failed.\nReason: ($result) " .
        socket_strerror(socket_last_error($socket)));
  }
  return $socket;
}

function writeSocket($stmt) {
  $tries = 0;
  $socket = getSocket();
  do {
    // Is is possible that socket_write may not write the full $stmt?
    // Do I need to keep rewriting until it's finished?
    $writeResult = socket_write( $socket, $stmt, strlen( $stmt ) );
    if ($writeResult === FALSE) {
      // Got  a broken pipe, What's the best way to re-establish and 
      // try to write again, do I need to call socket_shutdown?
      socket_close($socket);
      $socket = getSocket();
    }
    $tries++;
  } while ( $tries < MAX_SOCKET_TRIES && $writeResult ===  FALSE);
}
8
задан Juan Mendes 26 August 2011 в 18:55
поделиться