文件操作
PHP也提供了一套文件操作系统函数。通过这套函数进行文件管理,创建文件、删除、改名、存储数据,读取数据。
文件的理解:在文件管理系统文件分为两种
其一就是文件,用于存储数据
其二是文件夹,用于存储文件的文件
1. 文件相关信息
函数 | 说明 | 备注 |
---|---|---|
file_exists(filename); | 用于判断一个文件是否存在 | filename是一个表示文件的完整名的一个字符串 |
filemtime($filename); | 用于获取文件修改的时间 | 获得时间戳,用date()转换为具体时间 |
filesize($filename); | 用于获取文件的大小 | 单位为字节 |
basename(path); | 用于获取文件名 | |
realpath(path); | 用于判断path是否是真实存在的一个路径 | 如果不是返回的是布尔false。如果是那么会将‘/’转换为‘\’,并将相对路径转换为绝对路径 |
2. 打开文件fopen()
fopen(filename,code); | 用于打开一个文件,用于之后的对文件内容的读写操作 |
---|---|
filename | 是一个表示文件的完整名的一个字符串 |
mode | 表示打开的方式 |
mode取值 | 打开文件方式 | 说明 |
---|---|---|
r | 读 | 文件不存在则报错 |
r+ | 读写 | 文件不存在则报错 |
w | 写 | 文件不存在则创建文件,如果文件存在则清空文件 |
w+ | 读写 | 文件不存在则创建文件,如果文件存在则清空文件 |
a | 追加 | 文件不存在则创建文件,如果文件存在并不会清空文件 |
a+ | 追加及读 | 文件不存在则创建文件,如果文件存在并不会清空文件 |
如果以r、r+打开的文件,那么文件指针位于头部
如果以a、a+打开的文件,那么文件指针位于尾部
如果打开成功返回的是一个资源类型:
$filename="./data.txt";
$return=fopen($filename,'r');
var_dump($return);//返回:resource(3, stream)
3. 关闭文件
fclose(handle);
handle是fopen()函数返回的资源
用于判断handle所指向的文件
$filename="./data.txt";
$return=fopen($filename,'r');
fclose($return);
var_dump($return);//返回resource(3, Unknown)
4. 写入文件fwrite()
fwrite(handle,data) | - |
---|---|
handle | fopen()函数返回的资源 |
data | 所要写的数据 如果写入成功则返回写入字节数 如果写入失败则返回0 |
file_put_contents(filename,data);
用于向文件中写入数据,特点是文件不需要打开,如果文件存在则清空文件内容
5. 读取文件内容
函数 | 说明 |
---|---|
fgetc(handle); | 每次从handle所代表的文件中读取一个字符,文件的指针会下移一行 |
fgets(handle,len); | len表示读取的字节个数-1,默认是1024 当遇到换行回车时就结束读取 |
fread(handle,len); | len表示读取的字节个数,不可以省略 当遇到换行回车时,不受影响 |
file(filename); | 将文件中的每一行读取的一个元素,并返还整个数组 |
readfile(filename); | filename用于表示文件的字符串 将读取到的内容自动放到输出缓存(直接输出,不需要echo) |
file_get_contents(filename); | 一次性将所有文件读取出来 |
file()示例:
6. 拷贝文件
copy(source,dest); | 用于复制一个文件,复制文件时可以改名 |
---|---|
source | 源文件 |
dest | 目录文件 |
7. 删除文件
unlink(filename); | 用于删除文件 |
---|
8. 文件的判断
is_file(filename); | 主要用于区分文件还是文件夹(文件是否存在) |
---|
9. 文件指针(了解)
函数 | 说明 |
---|---|
ftell(handle); | 用于获取文件的指针位置 |
fseek(handle,n,【whence】); | 用于移动文件的指针位置 |
注: | - |
handle | 是fopen函数的返回值,代表实际的文件 |
n | 偏移量 |
whence | 移动的相对位置,取值: SEEK_SET 相对于文件头 SEEK_END 相对于文件尾 SEEK_CUR 相对于当前位置 |
/打开文件
$filename="./data.txt";
$handle=fopen($filename,'r');
//移动文件指针
$return=fseek($handle,-3,SEEK_END);
echo fgetc($handle);
10. 文件锁(了解)
flock(handle,type); | - |
---|---|
type | 锁的类型 |
//打开文件
$filename="./data.txt";
$handle=fopen($filename,'r');
//锁文件
flock($handle,LOCK_EX);
sleep(10);//10秒后解锁
目录操作
1. 创建目录
mkdir(path,mode,recursive); | - |
---|---|
part | 所要创建的文件夹 |
mode | 权限,主要体现在Linux |
recursive | 取值为布尔值,表示要创建层级文件夹 |
//创建单个文件夹
$folder='Parent';
mkdir($folder);
//创建多级文件夹
$folder='Parent/Childen/';
mkdir($folder,1,true);
2. 打开目录
opendir(folder); | - |
---|---|
folder | 表示文件夹目录的一个字符串 如果打开成功返回一个资源类型 |
3. 关闭目录
closedir(handle); | - |
---|---|
handle | opendir函数的返回值 |
4. 目录重命名
rename(source,dest); | - |
---|---|
source | 原文件夹 |
dest | 新文件夹名 |
5. 删除目录
rmdir(folder);
6. 读取目录内容
readdir(handle);
用于读取文件夹的内容,只能读取当前层级内容,不能读取子文件夹中的内容
每次只读取一个条目,并将指针下移一行
7. 扫描目录
scandir(folder);
一次性将当前文件夹(不包含子文件夹)中所有内容读取到数组中,并返还这个数组
8.判断文件夹
is_dir(dir);
dir就是一个表示文件夹的字符串
用于判断文件夹
9.遍历文件夹
//遍历制定文件夹中的所以内容
//1、设置一个函数,输出给定的文件夹中所有的内容
//2、如果是文件夹以红色显示,如果是文件以蓝色显示(区分文件夹与文件)
//3.如果是子文件夹,再遍历出子文件夹左右内容
$dir='../demo';
function getTree($dir){
$arr=scandir($dir);
foreach ($arr as $v){
$item=$dir.'/'.$v;
//判断是否为文件夹
if(is_dir($item)) {
//如果是文件夹,且不是.获..,继续遍历
if($v=='.'||$v=='..'){
continue;
}
echo '<font color="red">' . $item . '</font>', '<BR>';
getTree($item);
}else{
//如果不是文件夹,直接输出
echo '<font color="blue">' . $item . '</font>', '<BR>';
}
}
}
getTree($dir);
HTTP协议
1.概念
HyperText Transformation Protocol(超文本传输协议)
HTTP互联网一个基石,就是客户端与web服务的通讯规则,规定了通讯双方通许时所采用的格式,以及格式的含义
2.HTTP协议的特点
- 支持c/s(客户端/服务器)结构
- 简单,客户端向服务器端发起请求时,只需要传递所请求的文件即可
- 灵活,服务器端向客户端响应数据,可通过content-type,来设置返回的数据类型
- 无连接,服务器每次只处理一个请求,请求结束后断开与客户端的连接
- 无状态,由于服务器与客户端具有无连接的特性,所以不了解客户端的本次请求,服务器并不知道本次请求与上次请求是否来源于同一个客户端,无法跟踪客户端的状态
3.HTTP协议的组成
两部分组成:
(1).由客户端发起的请求部分
(2).由服务器端对客户端的响应部分
4.HTTP请求
http的请求是由浏览器根据用户输入的URL,或点击某个页面上的按钮,而自动进行组织的
HTTP请求由三部分组成
(1). 请求头
说明 | 代码 |
---|---|
请求方式 | GET |
URI(请求的文件名) | /yzf/demo/file.html |
协议及版本号 | HTTP/1.1 |
(2). 报头
常见 | 说明 |
---|---|
Host | 请求的主机名 |
Connect | 保持连接 |
User-Agent | 浏览器的相关信息,会自动携带给服务器 |
Accept | 浏览器所能处理的数据的格式 |
Accept-Encoding | 浏览器所支持的压缩格式 |
Accept-Language | 浏览器所支持的语言 |
If-Modified-Since | 用于询问当前所请求的内容,自从上次是否有修改过 |
(3). 空行
空行作用是用于分隔协议头与实际的数据
5.HTTP响应
HTTP协议的响应是由web服务器根据用户的请求,进行处理后,自动进行组织的
(1).响应行
- | - |
---|---|
协议及版本号 | HTTP/1.1 |
状态码 | 200 |
状态描述 | OK |
常见的状态码 | 描述 |
---|---|
200 | 成功 |
404 | 请求文件不存在 |
403 | 没有权限 |
(2).响应的报头
- | 说明 |
---|---|
Date | 时间 |
Server | 服务器的相关信息 |
Last-Modified | 与客户端请求头中的Last-Modified-Since对应 |
Content-Type | 此次响应的数据是什么格式,默认都是text/html |
Accept-Length | 所返回的数据的长度317 |
Accept-Range | 返回的数据的单位 |
(3). 空行
空行作用是用于分隔协议头与响应的实际的数据
6.PHP操作和HTTP响应头
默认HTTP协议的响应头是由web服务器自动组织,PHP为我们提供了一个设置HTTP响应的协议头的函数header
(1).设置浏览器显示编码
header(‘Content-Type:text/html;charset=utf8’);
(2).用于进行跳转
header(‘location:url’);
(3).下载
//1.通过协议头告诉浏览器端,将要发送的数据,不能使用图片格式,而应该作为一个应用程序数据
header('Content-Type:application/octet-stream');
//2.通过协议头告诉浏览器,将要发送的数据,作为附件下载
header('Content-disposition:attachment;filename=ok..png');
$return=file_get_contents('3.png');
数据采集(了解)
1.什么是数据采集
我们创建网站是为了显示数据,但有一些数据的获取成本非常高。所谓的数据采集就是将别人网站的数据,为我们所用。
2.curl函数
Curl是一个代码版的浏览器。允许我们在代码中像使用浏览器一样访问别人的页面。默认PHP并没有开启对curl的支持,需要自己在配置文件中手动开启。
提示:如果开启后也无法使用,需要将php目录中的4个文件libeay32.dll、libss32.dll、ssleay32.dll、php5ts.dll文件复制到Apache的bin目录中
一般配置好wamp64都是默认开启的
3.curl函数的使用
(1).初始化curl(打开一个浏览器)
curl_init()
(2).设置参数(输入地址)
curl_setopt(curl,参数名,参数值); | - |
---|---|
curl | 就是curl_init的返回值 |
参数名 | 参数都是以常量的形式设计的 |
CURLOPT_URL | 用于设置所请求的网址 |
CURLOPT_RETURNTRANSFER | 取值若为1,表示不将收到的数据直接返回给浏览器,而是作为curl_exec()函数的返回值 |
CURLOPT_POST | 取值为1 |
CURLOPT_POSTFIELDS | 用于设置post请求所携带的数据 |
(3).执行curl(回车)
curl_exec(); 用于执行某个curl工具
//1.初始化curl(打开一个浏览器)
$ci=curl_init();
//2.设置curl选项(输入地址)
curl_setopt($ci,CURLOPT_URL,'http://www.baidu.com');
curl_setopt($ci,CURLOPT_RETURNTRANSFER,1);
//3.执行curl(回车)
$html= curl_exec($ci);
file_put_contents('test.txt',$html);
4.模拟get请求
5.模拟post请求
//1.初始化curl(打开一个浏览器)
$ci=curl_init();
//2.设置curl选项(输入地址)
$url='http://localhost/yzf/news/php/insertNews.php';
curl_setopt($ci,CURLOPT_URL,$url);
curl_setopt($ci,CURLOPT_RETURNTRANSFER,1);
//设置post请求方式
curl_setopt($ci,CURLOPT_POST,1);
//定义数据
$data=['n_name'=>'^_^','n_id'=>2,'n_sort'=>100,'n_dest'=>'测试','n_content'=>'unstopable'];
curl_setopt($ci,CURLOPT_POSTFIELDS,$data);
for($i=0;$i<3;$i++) {
//3.执行curl(回车)
curl_exec($ci);