php socket 断开连接,PHP:socket_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, $string, $length);

//OR - $sent = socket_send($client, $string, $length, 0);

if($sent === FALSE)

{

error_log("false");

return;

}

if($sent < $length)

{

$string = substr($string, $sent);

$length -= $sent;

}

else

return;

}

}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值