PHP中的socket_read和socket_recv区别详解
这篇文章主要了PHP中socket_read和socket_recv两个函数的区别。这两个函数看似功能相似,实则存在明显的差异。本文将结合源码深入分析这两个函数的异同,为开发者提供清晰的参考。
我们来看一下这两个函数的声明。socket_read函数通过执行结果返回收到的数据,而socket_recv则通过引用的形式返回数据。socket_recv函数还多了flags参数,使得功能更加灵活。
接下来,我们详细解读socket_recv的源码。该函数首先进行参数,然后获取socket资源。接着进行溢出检查,确保数据接收的缓冲区足够大。然后,通过调用系统的recv函数来接收数据,并对接收到的数据进行处理。如果接收失败,则会释放相关资源并返回FALSE。如果接收成功,则会将接收到的数据存入缓冲区,并返回实际接收到的字节数。
在源码中,有一行非常关键:if ((retval = recv(php_sock->bsd_socket, recv_buf, len, flags)) < 1)。这一行实际上调用了系统的recv函数来接收数据。这意味着socket_recv函数的主要功能就是封装了系统的recv函数,并对其输入参数和返回结果进行了处理。
相对于socket_recv,socket_read的功能较为简单。它直接从socket读取数据并返回,不需要处理太多细节。在实际使用中,开发者可以根据具体需求选择使用哪个函数。
让我们再次深入socket_read函数,它相较于系统的recv函数多出了一个$type参数。我认为这正是此函数存在的价值所在。查阅文档,我们可以看到type参数有两个值:PHP_BINARY_READ和PHP_NORMAL_READ。从文档描述中,PHP_BINARY_READ将直接使用系统的recv方法,而PHP_NORMAL_READ则会一直读取数据,直到遇到换行符或回车符\r。接下来,我们来看看源码中的实现。
源码如下(省略了部分无关内容):
当type等于PHP_NORMAL_READ时,会调用php_read函数。否则,会调用系统的recv函数。而在PHP_NORMAL_READ模式下,其行为与socket_recv相同,都使用系统的recv函数。当使用PHP_NORMAL_READ时,情况会有所不同,它将使用自定义的php_read函数。那么,这个php_read函数是做什么的呢?让我们继续深入源码。
源码中有一段关键代码,它包含一个循环,该循环会一直运行直到遇到换行符或回车符\r,或者读取的数据长度达到指定的maxlen。在循环中,如果m值为0且处于非阻塞模式,并且no_read的值大于等于2时,函数将返回当前已经读取的字符数n。如果no_read的值大于200,函数将设置错误号为ECONNRESET并返回-1。
这两个函数虽然看起来有些复杂,但核心逻辑是:根据type参数的值选择使用系统的recv函数或自定义的php_read函数进行读取操作。而在PHP_NORMAL_READ模式下,php_read函数会循环调用recv函数,直到遇到特定的终止字符或达到指定的数据长度。
希望这样的解释更加清晰易懂。如果您还有其他问题或需要进一步的解释,请随时告诉我!现在,让我们结束今天的,去好好休息吧!晚安!
(注:最后的“cambrian.render('body')”似乎与文章内容无关,已为您删除。)
编程语言
- PHP中的socket_read和socket_recv区别详解
- vue-router懒加载速度缓慢问题及解决方法
- thinkPHP5.0框架验证码调用及点击图片刷新简单实现
- JSP教程(三)--JSP中”预定义变量”的使用
- sublime text配置node.js调试(图文教程)
- ASP.NET笔记之 Httphandler的操作详解
- 使用asp代码突破163相册的防盗连
- 微信支付如何实现内置浏览器的H5页面支付
- PHP生成可点击刷新的验证码简单示例
- asp.net批量多选文件上传解决方案
- ASP 调用带参数输出的COM接口
- JavaScript解析JSON数据示例
- ASP连接SQL2005数据库连接代码
- php中utf-8编码下用正则表达式如何匹配汉字
- jsp从数据库获取数据填充下拉框实现二级联动菜
- jsp实现checkbox的ajax传值实例