Php 向插座写入数据并处理损坏的管道
我有一些PHP代码连接到套接字。我在给它写信时,断断续续地碰到一根管子。如果再写信给管道,问题似乎就消失了。我想知道从中恢复需要什么(最安全的方法)。我还想知道socket_write是否会返回而不写入传递给它的完整字符串。这是我目前拥有的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
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?在读取套接字之前,脚本无需执行其他操作。