一些有志青年可能最近手刃了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% ,无论有无新用户。