stream_set_blocking阻塞和非阻塞到底怎么理解?????

0

如何用代码直观的展现出来????

已邀请:

blogdaren - 专注C编程、PHP内核、LINUX、VIM【http://www.phpcreeper.com】

赞同来自: zhuxiaoyu

伪代码如下:


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

要回复问题请先登录注册