Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 向插座写入数据并处理损坏的管道_Php_Sockets_Broken Pipe - Fatal编程技术网

Php 向插座写入数据并处理损坏的管道

Php 向插座写入数据并处理损坏的管道,php,sockets,broken-pipe,Php,Sockets,Broken Pipe,我有一些PHP代码连接到套接字。我在给它写信时,断断续续地碰到一根管子。如果再写信给管道,问题似乎就消失了。我想知道从中恢复需要什么(最安全的方法)。我还想知道socket_write是否会返回而不写入传递给它的完整字符串。这是我目前拥有的 function getSocket() { $socket = socket_create( AF_UNIX, SOCK_STREAM, 0 ); if ( $socket === FALSE ) { throw new Exception

我有一些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);
}
函数getSocket(){ $socket=socket\u create(AF\u UNIX,SOCK\u流,0); 如果($socket==FALSE){ 抛出新异常( 创建套接字失败:原因:“.socket\u strerror(socket\u last\u error()); } } $result=socket\u connect($socket,$address); 如果($result==false){ 抛出新异常(“套接字连接()失败。\n原因:($result)”。 socket_strerror(socket_last_error($socket)); } 返回$socket; } 函数writeScocket($stmt){ $trys=0; $socket=getSocket(); 做{ //socket_write是否可能无法写入完整的$stmt? //我需要一直重写直到完成吗? $writeResult=socket_write($socket、$stmt、strlen($stmt)); 如果($writeResult==FALSE){ //如果管道破裂,重建和修复管道的最佳方法是什么 //请尝试再次写入,是否需要调用socket\u shutdown? 插座关闭($socket); $socket=getSocket(); } $T++; }而($trys您是否尝试过设置为“保持生命”或“保持时间”?您还可以在循环中测试缓冲区长度,以查看是否已发送整个内容

祝你好运,
--Joe

使用
socket\u set\u nonblock()


$writeResult==FALSE
应该是
$writeResult!==错误

Q1。我想知道从中恢复需要什么(最安全的方法)

答:那要看具体的应用。套接字侦听器正在关闭连接,或者您设置了未显示的套接字选项。如何处理这两种情况取决于应用程序的语义

问题2。我还想知道socket_write是否会返回而不写入传递给它的完整字符串


A:是的<代码>套接字_write()
在返回之前不能写入任何字节、部分字节或所有字节。如果它返回的值大于零但小于输入长度,则应调整偏移量(可能使用
substr()
)。如果返回零或更少,请检查
socket\u last\u error()
,以了解是否可以重试。这个变形已经涵盖。

我知道我可以测试socket\u write的返回值,看看实际写入了多少字节,我的问题是这是否真的是必要的,我见过的大多数示例都没有尝试这样做。另外,你是什么意思,通过设置SO_KEEPALIVE和SO_SNDTIMEO,我不会得到损坏的管道?管道断开是因为套接字服务器(不是PHP)出现问题。我不认为在PHP客户端上我可以做任何事情来防止这种情况。警告消息:检测到一个错误,阻止加载此页面。如果此问题仍然存在,请与网站管理员联系。socket_write()[]:无法写入socket[32]:管道应用程序/类/cci/DataSrv.php中断我传递的唯一选项是我在示例中的选项。有人告诉我,我不必担心socket,因为这是一个UNIX域套接字,所以不存在网络延迟。你同意吗?socket\u write()的文档没有提供这样的保证。我为什么要使用socket\u set\u nonblock?在读取套接字之前,脚本无需执行其他操作。