当前位置:首页 > PHP > 正文内容

php stream_set_blocking设置非阻塞模式,php stream_set_blocking影响函数fgets()和fread()

高老师6年前 (2020-09-02)PHP1772

stream_set_blocking函数可以将资源流设置为阻塞模式或者非阻塞模式,主要影响的函数分别是fgets,fread,其他的手册没有说。

在socket编程中,如果一个socket连接上了,但是不发送数据,此时使用fread或者fgets去读取数据,由于socket句柄是有效的,但是获取不到数据,fread/fgets就会阻塞等待卡在那里,一直等到超时才继续向下执行。

看下面的阻塞等待demo:

服务器:

<?php
$socket = stream_socket_server('tcp://127.0.0.1:8888', $errno, $errstr);
while ($conn = stream_socket_accept($socket))
{
    //服务端知道客户端连接了,就是不给你发消息,先睡一会儿吧
    sleep(1000);
}
fclose($socket);

客户端:

<?php
$socket = stream_socket_client('tcp://127.0.0.1:8888', $errorno, $errstr);
echo 'start';
echo fread($socket, 128);
echo 'success';
fclose($socket);

由于服务器端不发送任何东西,fread一直卡住,阻塞等待,此时程序只输出start,一直到超时后才输出success。另外需要注意的是阻塞等待过程中如果对应的socket被关闭了也不会继续阻塞,例如上面的服务器端被关闭了。

再看下面的非阻塞等待demo:

客户端:

<?php
$socket = stream_socket_client('tcp://127.0.0.1:8888', $errorno, $errstr);
stream_set_blocking($socket,false);
echo 'start';
echo fread($socket, 128);
echo 'success';
fclose($socket);

非阻塞等待的比较简单,我去获取数据,没有就算了直接返回,根本不去等你给我发。

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/155.html

分享给朋友:

“php stream_set_blocking设置非阻塞模式,php stream_set_blocking影响函数fgets()和fread() ” 的相关文章

PHP高并发下数据库值更新的问题

PHP高并发下数据库值更新的问题

(1).创建数据库test ,创建表shop(字段id,total),商品id是1,商品总数10    (2).PHP模拟购买,商品数量大于0才能购买<?php //连接数据库 $con=mysqli_connect("192.168.2.18...

php无限查询下级,php递归统计下级总数,php 获取无限子级

php无限查询下级,php递归统计下级总数,php 获取无限子级

因项目需要需要统计用户无限下级计算分销佣金,计算每月分红,计算无限下级团队的业绩,需要先获得某个会员的无限下级成员。先看看数据库中的member表字段id            username       &...

 php调用.net的dll文件,php调用.net dll

php调用.net的dll文件,php调用.net dll

本篇文章不是讲解如何用.net开发自己的dll然后PHP通过com调用。主要记录PHP官方支持的DOTNET 基本语法如下:$obj = new DOTNET("assembly", "classname")a...

【二】PHP多进程学习-进程信号管理

【二】PHP多进程学习-进程信号管理

(1).学习目标:    了解常见信号类型(百度PHP支持的信号类型),(2).相关函数学习:    (2.1).pcntl_signal函数用于设置一个信号管理器接收进程信号,参数1:信号类型,参数2:回调函数,用于在接收到参数1类型的信...

cookie跨域,cookie p3p跨域

cookie跨域,cookie p3p跨域

最近在公司开发一个新的项目假设项目域名是a.com,需要接入b.com的单点登陆系统。(1).首先我们会在a.com的登陆页面用iframe引入b.com来显示登陆界面,实际上登陆验证操作都是在b.com上面(2).当b.com验证通过,会在前端ajax请求a.com的回调地址,这个回调地址目的就是...

php限制方法返回值类型

php限制方法返回值类型

php7新增的特性(1).强制限制只能返回一种类型<?php class task { } //must return an integer function add(): int {    &nb...