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 系列函数的介绍
利用缓冲区可以设计 FileCache
- 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()
还可以将缓冲的数据字符串用 gzip 编码方式压缩之后发送数据到 client 端的 browser
- $file_url = 'the file url';
- ob_start();
- phpinfo();
- $fp = fopen(md5($file_url), 'w+');
- fwrite($fp, ob_get_contents());
- ob_end_clean();
这里是 gzip 的编码函数
- /*
- 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();
- // 检测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 等协议
cURL 主要是针对 http 请求 cookie&session post 文件上传的模拟
- // 检查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
fopen 打开本地文件除外 fopen 打开 http 文件的时候
来源: http://lib.csdn.net/article/php/43618