我有一些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);
}
我想知道需要什么(最安全的方法)来恢复。
A:那要看应用程序了。套接字监听器正在关闭连接,或者您设置的套接字选项没有显示给我们。如何处理这些事情取决于应用程序的语义。Q2。我也想知道socket_write是否可以返回而不写入传递给它的完整字符串。
:是的。在返回之前,socket_write()
可以不写入字节,也可以写入部分字节,或者写入全部字节。如果它返回的值大于零,但小于输入的长度,则应该调整偏移量(可能使用substr()
)。如果返回0或更少,检查socket_last_error()
是否可重试的线索。
您是否尝试设置SO_KEEPALIVE或SO_SNDTIMEO?您还可以在循环中测试缓冲区长度,以查看整个内容是否已发送。
祝你好运。——乔
使用socket_set_nonblock()
并修复您的while
语句:
$writeResult === FALSE
应改为$writeResult !== FALSE