阻塞:是指应用程序执行 IO 操作须要彻底实现后才返回到用户空间
非阻塞:是指应用程序执行 IO 操作被调用后立刻返回给用户一个状态值,无需等到 IO 操作彻底实现。
阻塞模型:
非阻塞模式:
阻塞模式下,用户过程会始终期待内核态数据,所以效率极低。打个比方:小明要烧水,他就始终等着水烧开才行,但其实,在烧水过程中小明还能去做别事。
做个优化就是非阻塞模式,用户过程在执行 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);
工夫耗费:
阻塞模式
非阻塞模式
学习总结:利用对象形式封装了一套 io 网络库有须要能够参考一下:https://github.com/liweiphp/io-mode