php stream_set_blocking().,stream_set_blocking阻塞和非阻塞到底怎么理解?????

本文详细介绍了如何使用PHP创建TCP服务器,并对比了阻塞与非阻塞模式下socket操作的区别。在阻塞模式下,fread会等待数据返回,而进程可能因此被阻塞。而在非阻塞模式中,即使socket没有数据准备就绪,内核也会立即返回。通过pcntl_fork创建子进程处理客户端请求,展示了如何读取和响应客户端数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

伪代码如下:

$main_socket = stream_socket_server("tcp://0.0.0.0:8888", $error_code, $error_msg) or die('create server failed');

while(1)

{

set_error_handler(function(){});

$new_socket = stream_socket_accept($main_socket, 5, $remote_address);

restore_error_handler();

if(!$new_socket) continue;

//屏蔽或开启本行代码进行调试

//stream_set_blocking($new_socket, 0);

if(pcntl_fork() == 0)

{

while(1)

{

$pid = posix_getpid();

$request = fread($new_socket, 8192);

var_dump($request);

$msg = trim($request);

if(!empty($msg))

{

$response = "{$pid} | {$remote_address} | {$msg}" . PHP_EOL;

fwrite($new_socket, $response);

}

}

exit(0);

}

}

区别就在于:

1、当 socket处于阻塞模式时,比如:fread系统调用必须等待socket有数据返回,即进程因系统调用阻塞;相反若处于非阻塞模式,内核不管socket数据有没有准备好,都会立即返回给进程。

2、另外进程阻塞和socket阻塞不是一个概念,进程阻塞是因为系统调用所致,socket是否阻塞只是说明socket上事件是不是可以内核即刻处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值