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);
非阻塞等待的比较简单,我去获取数据,没有就算了直接返回,根本不去等你给我发。
<?php //设置Cookies数组 setcookie('Datatype[a]', '1'); setcookie('Datatype[b]', '2'); set...
使用php函数array_multisort()即可实现和SQL一样的order by排序. 例如我们需要对会员表按照主键降序排列,年龄升序排列://会员表数据 $list = []; $list[] = ['mid' =>&n...
<?php $member = new class { public function getInfo() { ...
php7.1引入了PHP异步信号处理函数pcntl_async_signals() 来处理阻塞问题。在php7之前信号处理方式有2种,第一种是基于ticks来每执行一行代码来触发执行信号监听,第二种是直接while(true){ //监听信号 }第一种方式如果某行的代码阻塞时间较长会影响...
自己的composer已经发布到packagist,但是无法使用composer require easy-task/easy-task来安装,只能在配置文件使用如下方式安装:"require": { "easy...
PHP7中,通过生成器委托(yield from),可以将其他生成器、可迭代的对象、数组委托给外层生成器。外层的生成器会先顺序 yield 委托出来的值,然后继续 yield 本身中定义的值。同时yield from也能获取到生成器的返回值...