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);非阻塞等待的比较简单,我去获取数据,没有就算了直接返回,根本不去等你给我发。
(1).创建数据库test ,创建表shop(字段id,total),商品id是1,商品总数10 (2).PHP模拟购买,商品数量大于0才能购买<?php //连接数据库 $con=mysqli_connect("192.168.2.18...
因项目需要需要统计用户无限下级计算分销佣金,计算每月分红,计算无限下级团队的业绩,需要先获得某个会员的无限下级成员。先看看数据库中的member表字段id username &...
本篇文章不是讲解如何用.net开发自己的dll然后PHP通过com调用。主要记录PHP官方支持的DOTNET 基本语法如下:$obj = new DOTNET("assembly", "classname")a...
(1).学习目标: 了解常见信号类型(百度PHP支持的信号类型),(2).相关函数学习: (2.1).pcntl_signal函数用于设置一个信号管理器接收进程信号,参数1:信号类型,参数2:回调函数,用于在接收到参数1类型的信...
最近在公司开发一个新的项目假设项目域名是a.com,需要接入b.com的单点登陆系统。(1).首先我们会在a.com的登陆页面用iframe引入b.com来显示登陆界面,实际上登陆验证操作都是在b.com上面(2).当b.com验证通过,会在前端ajax请求a.com的回调地址,这个回调地址目的就是...
php7新增的特性(1).强制限制只能返回一种类型<?php class task { } //must return an integer function add(): int { &nb...