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

伪代码如下:

$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上事件是不是可以内核即刻处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值