引言
本文基于原生的PHP代码实现,IO阻塞模型,所以本文章实现的阻塞模型和 swoole 没有任何关系。当然,日后用 swoole 实现该io模型肯定更加容易。但是原生php实现该模型确可以让你更好的理解这个 IO 模型。
参考文献
5种IO模型:https://blog.mailjob.net/posts/3565199751.html
github代码下载:https://github.com/mailjobblog/dev_php_io/tree/master/test/blocking
函数(stream_socket_server):https://php.golaravel.com/function.stream-socket-server.html
函数(stream_socket_client):https://php.golaravel.com/function.stream-socket-client.html
函数(fread):https://php.golaravel.com/function.fread.html
函数(fwrtie):https://php.golaravel.com/function.fwrite.html
IO阻塞模型
阻塞IO情况下,当用户调用read后,用户线程会被阻塞,等内核数据准备好并且数据从内核缓冲区拷贝到用户态缓存区后read才会返回。可以看到是阻塞的两个部分。
- CPU把数据从磁盘读到内核缓冲区。
- CPU把数据从内核缓冲区拷贝到用户缓冲区。

原生PHP代码演示
代码
server.php
1 |
|
client.php
1 |
|
测试
测试后发现,两个client同时请求的时候,client2需要等待client1的完成。
