IO缓冲,php中的ob缓冲机制,以及socket、curl、fopen这些函数的底层关系

1、IO缓冲

缓冲区是内存中的一部分 目的是协调外部设备(硬盘、显示器、键盘)数据处理速度与内部设备(CPU、memory)处理速度

内部设备处理速度远大于外部设备处理速度,为了不让CPU处于等待状态 设置缓冲区 当缓冲区数据满(4K ,这也是操作系统分页的容量)、刷新缓冲区、文件关闭

这三个情况都会将缓冲区数据送入CPU处理 


内存分页机制 4K = 1024*4 = 4096b 字节 当缓冲区的数据超过这个数字就会自动写入到外部设备

缓冲分为 全缓冲、行缓冲、错误缓冲

全缓冲

#include<fstream>
using namespace std;
int main()
{
	// 创建文件
	ofstream outfile("data.txt");
	for(int i=0;i<4096;i++)
	{//写入文件4096字节的'a'
		outfile<<'a';
	}
	/*
		这时4096字节的'a' 数据并没有真正写入文件(硬盘)而是在内存的键盘输入缓冲区中
		此时缓冲区正好写入4096字节 不会溢出 so (一般无任何其他操作情况下)也不会写入到外部设备
	*/
	system("PAUSE");
	// 将'b'写入到缓冲区 这时候缓冲区会溢出 4096字节的'a' 会输出到外部设备(硬盘) 也就是data.txt文件 缓冲区清空
	outfile<<'b';
	/*
		这时候的 'b' 是在缓冲区的第一个位置上 而不会写入文件
	*/
	system("PAUSE");
	return 0;// 程序结束 文件要关闭 在关闭前会将缓冲区内容写入到外设(文件),这时候你才能看到 'b' 写入文件
}

行缓冲区

#include<iostream>
using namespace std;
int main()
{
	/*
	getchar() 从输入字符串中国获取一个字符
	当按下回车键的时候getchar才会从输入的字符串中一个一个获取字符
	输入数据超过4K将不能在接受输入
	*/
	char c;
	c=getchar();
	//显示输入字符串的第一个字符
	cout<<c<<endl;
	system("PAUSE");
	// 循环剩下的字符
	while((c=getchar())!='\n')
	{
		printf("%c\n",c);
	}
	system("PAUSE");
	return 0;
}

还有一个错误缓冲 当程序出现错误,错误消息直接输出 不会遵循这种缓冲机制

2、php中的缓冲机制

缓冲区ob系列函数的介绍

void ob_start() 
激活缓冲区 脚本非文件头信息(cookie header 这些是文件头信息)均不会被发送而是保存在内部缓冲区
可使用 ob_end_flush() flush() 函数输出缓冲区内容

string ob_get_contents(void) 返回内部缓冲区内容 缓冲区未激活返回FALSE

int ob_get_length(void) 返回当前缓冲区数据的长度

void ob_clean() 关闭缓冲区 存在BUG
void ob_end_clean() 删除缓冲区内容 并且关闭缓冲区

flush() 刷新缓冲区 效率很高
void ob_end_flush() 将缓冲区内容输出到浏览器 并且关闭缓冲区

void ob_implicit_flush(int flag) 打开绝对输出后每个脚本的输出后直接发送到浏览器 不用调用flush()

利用缓冲区可以设计 FileCache

$file_url='the file url';
ob_start();
phpinfo();
$fp=fopen(md5($file_url),'w+');
fwrite($fp, ob_get_contents());
ob_end_clean();

还可以将缓冲的数据字符串用gzip编码方式压缩之后发送数据到client端的browser

/*
ob_gzhandler 是ob的回调函数此函数对缓冲区即将发送的数据进行gzip压缩然后发送给user's browser
并且能通过http请求头中Accept-Encoding 检测browser是否支持gzip编码
gzip压缩的数据格式(非纯文本)是要让browser解码 解析渲染的
并且编码是在数据发送出去的时候执行的 写入本地磁盘的时候不会执行
所以想要将编码后的数据写入磁盘要自己写 gzcompress or gzencode
*/
ob_start('ob_gzhandler');
phpinfo();
ob_end_flush();

这里是gzip的编码函数

// 检测gz扩展是否正确加载
if(!extension_loaded('gzlib')) exit();
$data = phpinfo();
// 编码
$gz1 = gzcompress($data);
$gz2 = gzencode($data);
// 解码
$data1 = gzuncompress($gz1);
$data2 = gzdecode($gz2);


3、socket curl fopen

socket 是c/s的交互基础 不同与http请求 socket是常连接  http是一次请求响应就断开了

交互的中间都可选的使用 TCP UDP SSL SMTP 等协议

// 检查sockets模块是否正确加载
if(!extension_loaded('sockets')) exit();
// 创建socket资源
source socket_create(AF_INET/ip种类, SOCK_STREAM/socket种类, SOL_TCP/协议);
// 对于server
// 绑定到指定ip 端口
bool socket_bind(source $socket, string $address/server ip地址[, int $port/端口]);
// 监听socket
bool socket_listen(sourct $socket,int $process_num/监听的进程数);
// 创建子进程 与client的socket进行交互
source socket_accept(source $socket);

// 对于client端
// 连接到服务器
bool socket_connect($socket, $address[, $port]);

// 交互 
// 发送数据
int socket_write(source $socket, string $buffer[,int $length]);
// 接收数据
string socket_read(source $socket, int $length)
// 关闭socket
socket_close(source $socket);

        c                          s
-----------------------------------------------
create bind listen	|  create bind listen
----------------开始交互-----------------------

                                 accept
-----------------------------------------------
      connect
-----------------------------------------------
                                 read
-----------------------------------------------
      write

cURL 主要是针对http请求 cookie&session  post 文件上传的模拟

fopen打开本地文件除外 fopen打开http文件的时候



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值