PHP Streams 中的阻塞和非阻塞模式

Posted

技术标签:

【中文标题】PHP Streams 中的阻塞和非阻塞模式【英文标题】:Blocking and non-blocking modes in PHP Streams 【发布时间】:2011-07-14 18:03:02 【问题描述】:

我正在准备 php 5 认证考试。在练习考试中提到了这个功能。

函数stream_set_blocking():

设置阻塞或非阻塞模式 一个流。

此功能适用于任何流 支持非阻塞模式 (目前,常规文件和套接字 流)。

从高级和低级的角度来看,阻塞模式和非阻塞模式流在 PHP 中的表现如何?什么是套接字流和非套接字流?示例表示赞赏。

【问题讨论】:

【参考方案1】:

阻塞/非阻塞模式表示 fread/fwrite 函数是否会立即返回。在non-blocking mode 中时,它们将返回任何可用数据。如果在调用函数时无法读取数据,则不会返回任何数据。此类流通常在循环中进行轮询。

然而,在blocking mode 中,该函数将始终等待(因此会阻止您的程序执行),直到它能够满足完整的读取请求。如果您要求从网络套接字读取 1MB,该函数将在收到 1MB 以传递之前不会返回。

我认为***很好地涵盖了它:http://en.wikipedia.org/wiki/Berkeley_sockets#Blocking_vs._non-blocking_mode

它主要影响网络文件/流源。对于本地文件系统,操作系统将始终读取所需长度的数据。 PHP 也有stream wrappers,它可以自行决定处理该选项(没有可靠的一般规则)。

有关更多底层细节,请访问 fnctl(2) 或 socket(2) 的手册页或http://www.scottklement.com/rpg/socktut/nonblocking.html

【讨论】:

以上是关于PHP Streams 中的阻塞和非阻塞模式的主要内容,如果未能解决你的问题,请参考以下文章

Linux 阻塞和非阻塞IO 实验

非阻塞socket总结

什么是阻塞式和非阻塞io流?

从linux源码看socket的阻塞和非阻塞

从linux源码看socket的阻塞和非阻塞

从linux源码看socket的阻塞和非阻塞