gpt4 book ai didi

php - 写入套接字并处理损坏的管道

转载 作者:可可西里 更新时间:2023-11-01 12:38:57 24 4
gpt4 key购买 nike

我有一些连接到套接字的 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);
}

最佳答案

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

答:这取决于应用。套接字监听器正在关闭连接,或者您设置了没有向我们展示的套接字选项。您如何处理这些事情取决于应用程序的语义。

Q2。我还想知道 socket_write 是否可以在不写入传递给它的完整字符串的情况下返回。

答:是的。 socket_write() 在返回之前可以不写入任何字节、部分字节或所有字节。如果它返回一个大于零但小于输入长度的值,您应该调整偏移量(可能使用 substr())。如果它返回零或更少,请检查 socket_last_error() 以获取有关它是否可重试的线索。这种扭曲被涵盖了in the manual .

关于php - 写入套接字并处理损坏的管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7209292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com