php u0026,PHP文件核心编程

想一想:什么是文件?

Linux文件

定义:存储在某种设备中的一段数据流

在Linux中,几乎一切都是文件

文件类型:普通文件、链接文件、目录文件、设备文件

设备文件:/dev/tty, /dev/null, /dev/zero

每个文件对应一个“inode”数据

inode包含什么内容?

文件的字节数

文件的uid和gid

文件的读、写、执行权限

文件的时间戳:ctime,mtime,atime

链接数:有多少文件名指向这个inode

文件数据block的位置

ext3文件系统特点

ext3是一种日志式文件系统

最长文件名:255字节

最大文件大小:16GB-64T(取决于块尺寸)

最大卷容量:2TB-32TB

最大文件数量:可变

XFS文件系统特点

XFS是一种日志式文件系统,最早1993年

最长文件名:255字节

最大文件大小:8 exbibytes减1字节

最大卷容量:16 exabytes

最大文件数量:可变

已经在CenOS7上作为默认文件系统

文本文件和二进制文件有什么不同?

文本文件是基于字符编码的文件

除了文本文件以外的文件称为二进制文件

二进制文件编码是变长的,灵活利用率高

两者读写差别仅体现在回车换行符的处理上

文本文件是一种特殊的“二进制文件”

文件的打开方式有哪些?

$handle = fopen(‘test.txt’, ‘r’);

r 只读方式打开,将文件指针指向文件头

r+ 读写方式打开,将文件指针指向文件头

w 写入方式打开,将文件指针指向文件头(源文件会被清空)

w+ 读写方式打开,将文件指针指向文件头(同上)

a 写入方式打开,将文件指针指向文件末尾

a+ 读写方式打开,将文件指针指向文件末尾

x 创建并以写入方式打开,将文件指针指向文件头(原有文件不能存在)

x+ 创建并以读写方式打开,其他的行为和x一样(同上)

c 写入方式打开,将文件指针指向文件头(原有文件会被覆盖)

c+ 读写方式打开,将文件指针指向文件头(同上)

文件的打开方式的特殊标记

1.标记(’t’)可以将\n转换为\r\n(windows)

$handle = fopen(“test.txt”, “wt”);

2.标记(’b’)来强制使用二进制模式

$handle = fopen(“test.txt”, “rb”);

把多个文件合并为一个文件

$fh = fopen(‘dest.txt’, ‘?’);

$fh1 = fopen(‘file1.txt’, ‘?’);

$fh2 = fopen(‘file2.txt’, ‘?’);

练习:用pack创建二进制文件

1.用pack创建二进制文件“my.db”,文件里面存入的内容为:姓名、QQ号、email。

$fh = fopen(‘./my.db’, ‘w’);

$name = pack(‘A20’, ‘zsf’); //A20的意思是将字符串以空格填满

$age = pack(‘S’, 255);

$email = pack(‘a20’, ‘zhangsf@qq.com’); //a20的意思是将字符串以null填充

fwrite($fh, $name . $age . $email);

或者

$data = pack(‘A20Sa20’, ‘zwf’, 1219, ‘wf@qq.com’);

fwrite($fh, $data);

2.用unpack把以上文件内容读取出来。

$data = file_get_contents(‘my.db’);

$items = unpack(‘A20name/Sage/a20email’, $data);

print_r($items);

怎么判断是不是PNG图片?

89504E470D0A1A0A0000000D49484452

.PNG........IHDR

0

文件指针的定位操作

fseek() 在文件指针中定位

ftell() 返回文件指针读/写的位置

rewind() 倒回文件指针的位置

feof 测试文件指针是否到了文件结束的位置

随机读写文件的应用

分析读取特定的二进制文件的内容,如纯真IP库、QQ本地消息、图片元数据信息等

创建特定的二进制文件,如pdf,word,chm等

对大文件进行切割,如视频切割器

创建自定义的二进制文件,实现自己的独特需求,如设计自己的数据库文件

PHP中XML处理方式比较

DOM:一次性将xml载入内存,内存问题需要注意

SimpleXML:小文件可以选择它,不支持命名空间。

$string = <<

login

imdonkey

XML;

pring_r($xml);

XMLReader:边读边操作,“拉取”模型

港台明星

刘德华

1995

大陆演员

范冰冰

1997

$reader->open('collection.xml', 'utf-8');

while($reader->read()){

if($reader->name=="cd" && $reader->nodeType==XMLReader::ELEMENT){

$item=[];

while($reader->nodeType!=XMLReader::ELEMENT)continue;

$name=$reader->name;

$value=$reader->readString();

// echo $key=$reader->getAttribute('name');

$item[$name]=$value;

}

$items[]=$item;

}

$reader->close();

print_r($items);

XML Parser:SAX模型是一个“推送”模型

$file = "collection.xml";

$depth = [];

function startElement($parser, $name, $attrs)

{

global $depth

print_r($attrs);

}

function endElement($parser, $name)

{

global $depth;

}

function data($parser, $data)

{

var_dump($data);

}

$xml_parser = xml_parser_create('UTF-8');

xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, 1);

xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);

xml_set_element_handler($xml_parser, "startElement", "endElement");

$fp = fopen($file, "r");

while($data = fread($fp, 4096)){

if(!xml_parser($xml_parser, $data, feof($fp))){

die(sprintf("XML error: %s at line %d",

xml_get+current_line_number(xml_parser)));

}

}

PHP中JSON的处理

一下符合JSON标准的有?

A:{a:’abc’}

B: {‘a’:’abc’}

C: {“a”:”abc”,}

D:{“a”:”abc”}

jsson_encode 目前只能处理UTF-8编码的数据

JSON_UNESCAPED_UNICODE 让JSON更懂中文

解析出错,看json_last_error()返回的错误

JSON格式是灵活开放的,特殊情况可以用sprintf来自己组装或者解析JSON字符串

$format = ‘[“%s”,%d,%b]’;

echo $jsonstr = sprintf($format, ‘张三丰’, 16, false);

$json = json_decode($jsonstr);

print_r($json);

echo json_last_error_msg();

function encode($data){

switch ($type = gettype($data)){

case 'NULL':

return 'null';

case 'boolean':

return ($data ? 'true' : 'false');

case 'integer':

case 'double':

case 'float':

return $data;

case 'string':

return '"' . addcslashes($data, "\r\n\t\"") . '"';

case 'object':

case 'array':

$count = 0;

$indexed = [];

$associative = [];

foreach ($data as $key => $value){

if($count !== NULL && (gettype($key) !== 'integer' || $count++ !== $key)) {

$count = NULL;

}

$one = encode($value);

$indexed[] = $one;

$associative[] = encode($key) . ':' . $one;

}

if ($count !== NULL) {

return '[' . implode(',', $indexed) . ']';

} else {

return '{' . implose(',', $associative) . '}';

}

default:

return '';

}

}

json_encode的参数

JSON_HEX_TAG 所有的 < 和 > 转换成 \u003c 和 \u003e

JSON_HEX_AMG 所有的 & 转换成 \u0026

JSON_HEX_APOS 所有的 ‘ 转换成 \u0027

JSON_HEX_QUOT 所有的 ” 转换成 \u0022

JSON_FORCE_OBJECT 强制使用索引数组输出

JSON_NUMERIC_CHECK 将所有数字字符串编码成数字

JSON_BIGINT_AS_STRING 将大数字编码成原始字符原来的值

JSON_PRETTY_PRINT 用空白字符格式化返回的数据

JSON_UNESCAPED_SLASHES 不要编码 /

JSON_UNESCAPED_UNICODE 以字面编码多字节Unicode字符(默认是编码成 \uXXXX)

CSV文件处理

fputcsv()

fgetcsv()

$list = array(

array('aaa', 'bbbb', 'ccc', 'ddd'),

array('123', '456', '789'),

array('"aaa"', '"bbb"'),

);

$fp = fopen('file.csv', 'w');

foreach($list as $fields) {

fputcsv($fp, $fields, ';'); //默认 , 号

}

fclose($fp);

fopen 还能打开什么?

fopen(‘php://stdout’, ‘w’);

file:// 访问本地文件系统

http:// 访问HTTP(S) 网址

ftp:// 访问FTP(S) URLs

php:// 访问各个输入/输出流(I/O streams)

zlib:// 压缩流

http://php.net/manual/zh/wrappers.php

fputs(STDOUT, strtoupper(fgets(STDIN)));

//echo stroupper(fgets(STDIN));

//fputs(STDOUT, ‘hello’);

//$fp1 = fopen(‘php://stdin’, ‘r’);

//echo strtoupper(fgets($fp1));

//$fp2 = fopen(‘php://stdout’, ‘w’);

//fputs($fp2, ‘hello’);

如何实现超大文件上传?

客户端控件:需要本地安装指定控件

采用 swfUpload、uploadify 等Flash组件

用XMLHttpRequest 实现大文件上传和断点续传

XMLHttpRequest 2.0 的新特性

可以上传文件

可以设置HTTP请求的时限

可以使用FormData对象管理表单数据

可以请求不同域名下的数据(跨域请求)

可以获取服务器端的二进制数据

可以获取数据传输的进度信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值