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 中的阻塞和非阻塞模式的主要内容,如果未能解决你的问题,请参考以下文章