[转载]0x01 非阻塞和阻塞

adminv

一些有志青年可能最近手刃了Workerman源码,对于里面那一大坨stream_select()、stream_socket_server()表示疑惑,这个玩意和socket_create、socket_set_nonblock()有啥区别

<?php
// 创建一个监听socket,这个一个阻塞IO的socket
$listen = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
socket_bind( $listen, '0.0.0.0', 9999 );
socket_listen( $listen );
while( true ){
  // socket_accept也是阻塞的,虽然有while,但是由于accpet是阻塞的,所以这段代码不会进入无限死循环中
  $connect = socket_accept( $listen );
  if( $connect ){
    echo "有新的客户端".PHP_EOL;
  } else {
    echo "客户端连接失败".PHP_EOL;
  }
}

截图

<?php
// 创建一个监听socket,将其设置为非阻塞
$listen = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
socket_bind( $listen, '0.0.0.0', 9999 );
socket_listen( $listen );
// ⚠️⚠️⚠️⚠️⚠️⚠️ 这里设置非阻塞!
socket_set_nonblock( $listen );
while( true ){
  $connect = socket_accept( $listen );
  if( $connect ){
    echo "有新的客户端".PHP_EOL;
  } else {
    echo "客户端连接失败".PHP_EOL;
  }
}

截图

在监听socketIO的时候,设置为阻塞模式,只有当新用户连接时触发继续,在无新用户时,整个进程阻塞。

当设置为非阻塞模式中,会一直执行while循环,CPU100% ,无论有无新用户。

文章来自:
http://t.ti-node.com/thread/6445811932254437377

137 0 0
0个评论

adminv

3294
积分
0
获赞数
0
粉丝数
2021-08-06 加入
🔝