加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP:socket_write在写入时客户端断开连接时挂起

发布时间:2020-12-13 16:56:27 所属栏目:PHP教程 来源:网络整理
导读:当我在我的iOS应用程序中收到数据时(收到一些数据,但不是全部)我故意退出应用程序并且socket_write挂起在服务器上.这是相关代码: error_log("start write");$sent = socket_write($client,$string,$length);error_log("end write"); 我在错误日志中收到“开
当我在我的iOS应用程序中收到数据时(收到一些数据,但不是全部)我故意退出应用程序并且socket_write挂起在服务器上.这是相关代码:

error_log("start write");
$sent = socket_write($client,$string,$length);
error_log("end write");

我在错误日志中收到“开始写入”消息,但就是这样,它只是继续挂起,直到我重新启动php程序.

我尝试设置超时,但后来我尝试上传一个大文件,看起来它在上传完成之前超时了.我认为超时是一段时间不活动,而不是客户端连接的总时间.无论如何,任何帮助表示赞赏.我假设如果套接字断开连接,socket_write将返回,但是我错了或代码是.谢谢你的帮助.

编辑

基本上,我需要知道客户端何时断开连接.当客户端断开中间写入和阻塞模式时,看起来fwrite,socket_send和socket_write都挂起.如果我关闭阻止模式,我的代码如下所示:

function send_data($client,$string)
{
    $length = strlen($string);
    socket_set_nonblock($client);
    while(true)
    {
        $sent = socket_write($client,$length);
        //OR - $sent = socket_send($client,$length,0);

        if($sent === FALSE)
        {
            error_log("false");
            return;
        }
        if($sent < $length)
        {
                $string = substr($string,$sent);
                $length -= $sent;
        }
        else
            return;  
    }
}

这个问题是,当客户端断开连接时,$sent === FALSE,但是当它们暂时不可用时,这证明在发送前几个字节后发生,因此不发送整个字符串.

解决方法

您应该使用 socket_select()来确定套接字是否已准备好写入;以这种方式,你只需要在对方准备接收时写点东西.

您仍然需要检查传输的字节数并相应地减少消息.

例如:

function send_data($client,$string)
{
    socket_set_nonblock($client);

    while ($string != '') {
        $write = [$client]; $read = $except = null;
        // set timeout to 1s
        $n = socket_select($read,$write,$except,1);
        if ($n === false) {
            return;
        } elseif ($n > 0) {
            $length = strlen($string);
            $sent = socket_write($client,$length);
            if ($sent === false || $sent == $length) {
                return;
            } else /* $sent < $length */ {
                $string = substr($string,$sent);
            }
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读