php stream_set_blocking设置非阻塞模式,php stream_set_blocking影响函数fgets()和fread()

简介: php stream_set_blocking设置非阻塞模式,php stream_set_blocking影响函数fgets()和fread()

stream_set_blocking函数可以将资源流设置为阻塞模式或者非阻塞模式,主要影响的函数分别是fgets,fread,其他的手册没有说。

在socket编程中,如果一个socket连接上了,但是不发送数据,此时使用fread或者fgets去读取数据,由于socket句柄是有效的,但是获取不到数据,fread/fgets就会阻塞等待卡在那里,一直等到超时才继续向下执行。

看下面的阻塞等待demo:

服务器:

<?php
$socket = stream_socket_server('tcp://127.0.0.1:8888', $errno, $errstr);
while ($conn = stream_socket_accept($socket))
{

//服务端知道客户端连接了,就是不给你发消息,先睡一会儿吧
sleep(1000);

}
fclose($socket);
客户端:

<?php
$socket = stream_socket_client('tcp://127.0.0.1:8888', $errorno, $errstr);
echo 'start';
echo fread($socket, 128);
echo 'success';
fclose($socket);
由于服务器端不发送任何东西,fread一直卡住,阻塞等待,此时程序只输出start,一直到超时后才输出success。另外需要注意的是阻塞等待过程中如果对应的socket被关闭了也不会继续阻塞,例如上面的服务器端被关闭了。

再看下面的非阻塞等待demo:

客户端:

<?php
$socket = stream_socket_client('tcp://127.0.0.1:8888', $errorno, $errstr);
stream_set_blocking($socket,false);
echo 'start';
echo fread($socket, 128);
echo 'success';
fclose($socket);
非阻塞等待的比较简单,我去获取数据,没有就算了直接返回,根本不去等你给我发。

目录
相关文章
|
3天前
|
设计模式 中间件 PHP
探索PHP中的中间件模式
【7月更文挑战第12天】在现代的Web开发中,设计模式的应用对于代码的可维护性、扩展性和复用性至关重要。本文将深入探讨PHP语言中如何实现中间件模式,这是一种用于管理HTTP请求和响应的处理流程的设计模式。我们将通过具体示例来展示中间件模式如何在PHP项目中提升代码结构,并分析其在处理Web请求时的优势。
|
2天前
|
设计模式 开发框架 中间件
探索PHP中的中间件模式
【7月更文挑战第13天】在现代的Web开发中,设计模式扮演着至关重要的角色。本文将通过PHP语言的视角,深入探讨中间件模式的概念、实现及其在Web开发中的应用。我们将从中间件的定义开始,逐步过渡到如何在PHP框架中实现中间件,以及如何利用中间件来简化代码结构、增强应用的可扩展性和维护性。文章最后会提供一些实际案例,帮助读者更好地理解和运用中间件模式。
|
8天前
|
设计模式 中间件 PHP
深入理解PHP中的中间件模式
【7月更文挑战第7天】在Web开发的海洋中,PHP作为一艘灵活且强大的船,承载着无数的项目和解决方案。本文将揭开PHP中一个不为人知的角落——中间件模式,它如同船上的指南针,指引着请求的处理方向。我们将从中间件的定义出发,探索其在PHP中的应用实例,并深入分析其工作原理与实现方式,最终通过代码示例来揭示这一模式如何在实际应用中发挥巨大作用。文章旨在为读者提供对PHP中间件模式的全面认识,帮助开发者更好地利用这一模式优化项目架构。
|
4天前
|
设计模式 中间件 测试技术
PHP中的中间件模式解析与实践
【7月更文挑战第11天】在现代Web开发中,中间件模式已成为设计高效、可维护应用程序的关键。本文深入探讨了PHP环境下中间件模式的实现方法,并提供了一个实际示例来演示如何利用中间件优化请求处理流程。
|
4天前
|
存储 设计模式 监控
深入理解PHP中的中间件模式
【7月更文挑战第11天】本文将探索PHP中实现中间件模式的奥秘,从理论到实践,逐步剖析如何通过中间件提升代码的可维护性和扩展性。我们将摒弃传统的摘要形式,而是以一次虚拟的开发者对话引入话题,展现中间件在PHP项目中的应用价值和实现策略。
|
8天前
|
SQL 关系型数据库 MySQL
php所有函数总结
以上只是PHP中函数的一部分,实际上PHP提供了丰富的内置函数,能够处理各种复杂的任务。
8 2
|
20天前
|
设计模式 监控 中间件
PHP中的中间件模式及其应用
【6月更文挑战第24天】在PHP开发中,中间件是一种设计模式,它允许开发者在请求处理流程的不同阶段插入自定义的处理逻辑。本文将介绍PHP中间件的概念、实现方式以及如何利用中间件提高代码的可维护性和扩展性。通过实际案例,我们将探索中间件在身份验证、日志记录和性能监控等方面的应用,并讨论如何在Laravel框架中有效使用中间件。
|
22天前
|
SQL 分布式计算 前端开发
MaxCompute操作报错合集之SQL脚本设置参数set odps.mapred.reduce.tasks=18;没有生效,是为什么
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
20天前
|
设计模式 中间件 API
PHP中的中间件模式及其应用
【6月更文挑战第24天】在现代Web开发中,设计模式的应用是提高代码可维护性和扩展性的关键。本文将深入探讨PHP中中间件模式的概念、实现方式以及在实际项目中的应用案例,旨在为开发者提供一种灵活处理HTTP请求和响应的有效手段。
|
3天前
|
设计模式 负载均衡 中间件
深入理解PHP中的中间件模式
【7月更文挑战第12天】中间件模式在PHP开发中扮演着至关重要的角色,它允许开发者在请求处理流程中注入自定义的逻辑。本文将深入探讨中间件的工作原理、常见应用场景以及如何实现自己的中间件。通过实例演示,我们将揭示中间件模式如何优化应用架构,增强代码的可维护性和可扩展性。
4 0