php程序阻塞与非阻塞的区别,php实现五大io模型-1阻塞与非阻塞

阻塞:是指应用程序执行IO操作需要彻底完成后才返回到用户空间

非阻塞:是指应用程序执行IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。

阻塞模型:

f744a2ef937d6dc84a3b85c004261aff.png

非阻塞模式:

4a7ded515d119f5017d330e3d8a725a2.png

阻塞模式下,用户进程会一直等待内核态数据,所以效率极低。打个比方:小明要烧水,他就一直等着水烧开才行,但其实,在烧水过程中小明还能去做别事。

做个优化就是非阻塞模式,用户进程在执行IO操作后,内核态会立即返回一个数值通常就是空,用户进程可以去做别的事,等内核态数据结果好了在请求获取真正的执行结果。以上面小明例子就是,小明烧水时候,就可以去看书了,看一会去看看水是否开了,检查水是否烧开,同时又能看书学习。

性能分析:

假设一个程序需要执行两个操作a和b,其中a需要执行IO操作,b不需要。阻塞模式下消耗时间等于a+b,而非阻塞模式等于a和b中消耗时间最大都操作。

服务端代码:$server = stream_socket_server('tcp://127.0.0.1:9999', $erron, $error);

while (true) {

$conn = stream_socket_accept($server);

if ($conn) {

$data = fread($conn, 65535);

echo $data;

sleep(3);

fwrite($conn, 'this is server');

fclose($conn);

}

}

阻塞客户端:function operation()

{

sleep(2);

}

echo "client start n";

$client = stream_socket_client('tcp://127.0.0.1:9999', $erron, $error, 60);

fwrite($client, "is client 1n");

echo fread($client, 65535);

operation();

fclose($client);

非阻塞客户端:function operation()

{

sleep(2);

}

echo "client start n";

$client = stream_socket_client('tcp://127.0.0.1:9999', $erron, $error, 60);

stream_set_blocking($client, 0);//设置非阻塞

fwrite($client, "is client 1n");

operation();

while (!feof($client)) {

sleep(1);

var_dump(fread($client, 65535));

}

fclose($client);

时间消耗:

阻塞模式

669bb96ae3ec1a3711eb2afe19d5f395.png

非阻塞模式

0e39b670b7053b9ee5bdf38baec4a7c5.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值