当前位置: 首页 > 后端技术 > PHP

PHP实现五大io模型-1阻塞和非阻塞

时间:2023-03-29 15:15:41 PHP

阻塞:是指应用程序需要完成IO操作才返回用户空间非阻塞:是指应用程序立即返回给用户IO操作调用Status值后,无需等到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);如果($conn){$data=fread($conn,65535);回声$数据;睡觉(3);fwrite($conn,'这是服务器');fclose($conn);}}blockclient:functionoperation(){sleep(2);}echo"clientstartn";$client=stream_socket_client('tcp://127.0.0.1:9999',$erron,$error,60);fwrite($client,"isclient1n");echofread($client,65535);operation();fclose($client);非阻塞客户端:functionoperation(){sleep(2);}echo"clientstartn";$client=stream_socket_client('tcp://127.0.0.1:9999',$erron,$error,60);stream_set_blocking($client,0);//设置非阻塞fwrite($client,"isclient1n");operation();while(!feof($client)){sleep(1);var_dump(fread($client,65535));}fclose($client);耗时:阻塞模式非阻塞模式学习总结:使用对象方式封装一套io网络库with可以参考:https://github.com/liweiphp/io-mode