阻塞:是指应用程序执行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