问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

php socket 如何实现非阻塞

发布网友 发布时间:2022-04-07 08:48

我来回答

4个回答

热心网友 时间:2022-04-07 10:18

关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的;我打个很简单的比方,如果你调用socket send函数时;
如果是阻塞模式下:
send先比较待发送数据的长度len和套接字s的发送缓冲的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么 send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小,send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余空间大小send就仅仅把buf中的数据copy到剩余空间里
如果是非阻塞模式下:
在调用socket send函数时,如果能写到socket缓冲区时,就写数据并返回实际写的字节数目,当然这个返回的实际值可能比你所要写的数据长度要小些(On nonblocking stream oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both the client and server computers),如果不可写的话,就直接返回SOCKET_ERROR了,所以没有等待的过程。。
经过上面的介绍后,下面介绍如何设置socket的非阻塞模式:
当使用socket()函数和WSASocket()函数创建套接字时,默认都是阻塞的。在创建套接字之后,通过调用ioctlsocket()函数,将该套接字设置为非阻塞模式。
//-------------------------
// Set the socket I/O mode: In this case FIONBIO
// enables or disables the blocking mode for the
// socket based on the numerical value of iMode.
// If iMode = 0, blocking is enabled;
// If iMode != 0, non-blocking mode is enabled.
u_long iMode = 1; //non-blocking mode is enabled.
ioctlsocket(m_socket, FIONBIO, &iMode); //设置为非阻塞模式

套接字设置为非阻塞模式后,在调用Windows Sockets API函数时,调用函数会立即返回。大多数情况下,这些函数调用都会调用“失败”,并返回WSAEWOULDBLOCK错误代码。说明请求的操作在调用期间内没有时间完成。通常,应用程序需要重复调用该函数,直到获得成功返回代码。 不同的Windows Sockets API函数,在调用失败时返回的WSAEWOULDBLOCK错误代码具有不同的含义
需要说明的是并非所有的 Windows Sockets API 在非阻塞模式下调用,都会返回 WSAEWOULDBLOCK 错误。例如,以非阻塞模式的套接字为参数调用 bind() 函数时,就不会返回该错误代码。当然,在调用 WSAStartup() 函数时更不会返回该错误代码,因为该函数是应用程序第一调用的函数,当然不会返回这样的错误代码。
要将套接字设置为非阻塞模式,除了使用 ioctlsocket() 函数之外,还可以使用 WSAAsyncselect() 和 WSAEventselect() 函数。当调用该函数时,套接字会自动地设置为非阻塞方式:

热心网友 时间:2022-04-07 11:36

本地并发只能通过语言自己的特性在程序本身实现多任务效果,一般来说现在的语言会通过多线程或多进程的方式来实现。
由于PHP不支持多线程,目前只能采用多进程方式,让操作系统来帮助实现本地并发。
至于代码实现,可以通过pcntl扩展(封装fork等进程控制函数,和C语言中使用非常相似,windows下不可用)、 proc_open、popen等方式,方法不止一种,这里就不做详细介绍了。
详情可自行搜索“php多进程”进行了解:)

热心网友 时间:2022-04-07 13:10

select函数应该是针对你在参数表中列出的事件进行选择性处理的,比如,机器会自动监听,当发现有列表中的事件发生时,就会调用相应的操作,不过,调用什么操作也要事先定义。

热心网友 时间:2022-04-07 15:02

使用Workeman 框架 或者 Swoole PHP扩展 和 Swoole 框架 可以达到 非阻塞
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...最好是粉蓝绿之类的 大屏幕 前后摄像头 三星HTC索爱等都可 不要... ...3000左右的机子,htconex的水货怎么样与三星i9100比哪个更好一点,适... 私密照片适用机型 ...看上了三星的i9100和HTC的g19和索尼lt26 不知道选择哪一部 求大神... ...全部歌词?歌词大概……那是一个夜晚……我和谁谁媳妇缠绵…_百度知 ... 老年人缺铁性贫血有哪些症状 酪梨虾是什么 诺基亚C7无法使用OVI套件在电脑上升级地图。 我用ovi套件更新软件总手机重启后提示连接失败,跪求高人指点。。。_百... 我nokia2730c用ovi套件升级成v7.75版,结果变成全英文(设置语言修改没用... 一村一大的大学生志愿者,工作日志 怎么写啊??最好来点范文,谢谢~~ 手干活磨起泡了,然后泡磨破流水了怎么处理? 团支书在班级里上党课,内容是励志,十八大等的内容,怎么写党课总结? 手指磨出了泡,并且指节肿了,该怎么办 怎么写励志事迹 申请了特色团支部中的励志团支部现在要写申请书1000字,不知道怎么写,求指导,明天就要交了。 因为上班比较忙所以手指磨了一个水泡应该怎么办? 不可撤销的付款委托函是不是债权转让凭证? 我的青春我的团的励志标语 干活手起泡怎么办? 激励团干部名言 干活手上磨出了很多的泡,该怎么办呐? 干活手起水泡了怎么办 部队团支部活动委员每月要写一篇活动日记,有范文滴朋友帮帮忙最好可 干活时手指磨出啦很多水泡,怎么办会好的快些,比较严重,面积很大 读团看写一篇励志2000作文 电脑开机密码忘记了怎么可以进去啊 上班时因用力过度,手上磨起了个水泡,请问该怎么样治疗好得快? 团组织与祖国共奋进 为崛起献青春励志 励志作文怎么写 手磨起泡怎么办啊!? 手指上因为干活起了水泡,怎样最快消除它 三星手机note10 后壳有点开胶了是什么原因吗呀? 电商小程序开发哪家靠谱 手机后壳开胶,怎么处理,保修嘛 微信小程序开发价格到底是多少钱? 苹果手机外壳翘起来了,怎么维修? 微信小程序可以任何人进入编辑? 220伏变12伏电源适配器哪里找? 在哪里有开关电源适配器批发厂家? 电源适配器哪里有卖 电源适配器在哪里买? 电源适配器可以在哪里买啊! 机顶盒的开关电源适配器哪买? 怎么找到合适的电源适配器厂家? 荣耀20青春版和vivoiQOO那个好? 我的电脑(x43b)电源适配器坏了,我想问在网上哪里可以买吗? 谁在卖 电源适配器( 11.5V AC 1.6A)? 乐视盒子开关电源适配器在哪里买 华为荣耀20青春版和vivo Y7S哪个比较好?