php阻塞和非阻塞的区别,php fsockopen阻塞模式和非阻塞模式讲解

数据流的阻塞和非阻塞装填

stream_set_blocking ($resource, $flag);

$flag 取值为0或1   0是非阻塞,1是阻塞

阻塞的意义是什么呢?

某个函数读取一个网络流,当没有未读取字节的时候,程序该怎么办?是一直等待,直到下一个未读取的字节的出现,还是立即告诉调用者当前没有新内容?前者是阻塞的,后者是非阻塞的。

阻塞的好处是,排除其它非正常因素,阻塞的是按顺序执行的同步的读取。

而非阻塞,因为不必等待内容,所以能异步的执行,现在读到读不到都没关系,执行读取操作后立刻就继续往下做别的事情。

使用fsockopen的非阻塞模式请求另外的网址:

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);

if (!$fp) die('error fsockopen');

stream_set_blocking($fp,0);

$http = "GET /save.php / HTTP/1.1\r\n";

$http .= "Host: www.example.com\r\n";

$http .= "Connection: Close\r\n\r\n";

fwrite($fp,$http);

fclose($fp);

分段传输

分块传输编码是一种机制,允许将HTTP消息分成几个部分传输。同时适用于HTTP请求(从客户端到服务器)和 HTTP响应(从服务器到客户端)。

例如,让我们考虑HTTP服务器可将数据传输到客户端应用程序(通常是一个网络浏览器)使用哪些方式。通常情况下,在HTTP响应数据是按照一整块发送给客户端的,数据的长度是由Content - Length头域表示。数据的长度很重要,因为客户需要知道在哪里响应结束和后面的响应何时启动。而使用Chunked编码方式,不管怎样,数据都会分割成一系列的数据块和一个或多个转发的“块”,因此服务器在知道内容的长度之前,就可以开始发送数据后。通常情况下,这些数据块的大小是一样的,但也并不是绝对的。

Chunked编码使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分,头部内容指定下一段正文的字符总数(十六进制的数字)和数量单位(一般不写),正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些附加的Header信息(通常可以直接忽略)。

用下面的方法即可获取http原始数据:

$content = preg_replace_callback(

'/(?:(?:\r\n|\n)|^)([0-9A-F]+)(?:\r\n|\n){1,2}(.*?)'.

'((?:\r\n|\n)(?:[0-9A-F]+(?:\r\n|\n))|$)/si',

create_function(

'$matches',

'return hexdec($matches[1]) == strlen($matches[2]) ? $matches[2] : $matches[0];'

),

$content

);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值