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文件的时候