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

来源:互联网 发布:ubuntu和debian哪个强 编辑:程序博客网 时间:2024/05/29 04:21

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) 返回内部缓冲区内容 缓冲区未激活返回FALSEint ob_get_length(void) 返回当前缓冲区数据的长度void ob_clean() 关闭缓冲区 存在BUGvoid 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/端口]);// 监听socketbool 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)// 关闭socketsocket_close(source $socket);        c                          s-----------------------------------------------create bind listen|  create bind listen----------------开始交互-----------------------                                 accept-----------------------------------------------      connect-----------------------------------------------                                 read-----------------------------------------------      write

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

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



0 0