版权属于:
桑帅东的博客
作品采用:
《
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
》许可协议授权
设置为非阻塞模式,并增加读取数据超时时间设置;
socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,array("sec"=>10, "usec"=>0 ) );
记住:一定要注释掉非阻塞改为阻塞,不然即使加了阻塞超时设置也不会生效,因为本质是非阻塞,非阻塞就是死循环。
使用其他方式
其实该问题的本质还是解决死循环过程中CPU过高的问题,只不过我们改为阻塞,就避免了程序死循环过程中被过多占用CPU资源的问题,我们其实可以直接暴利一点使用sleep(),判断当接收不到数据时 就sleep来释放资源,不过这种方式过于暴利,会影响性能,你要知道循环一次sleep1毫秒 循环10000次就是10s 不可想象!!
总结
通过以上总结,我们在使用socket通信时,如果对并发量要求不高,尽量使用阻塞模式,由于我们使用了负载均衡,所以对单机并发量不是特别要求。
阻塞的socket函数在调用send,recv,connect,accept等函数时,如果特定的条件不满足,就会阻塞其调用线程直至超时,非阻塞的socket恰恰相反。
非阻塞模式一般用于需要支持高并发多QPS的场景(如服务器程序),但是正如前文所述,这种模式让程序的执行流和控制逻辑变得复杂;相反,阻塞模式逻辑简单,程序结构简单明了,常用于一些特殊场景中。
评论