文件的时间函数
函数 |
功能说明 |
filectime |
文件创建时间 |
filemtime |
文件修改时间 |
fileatime |
文件上次访问时间 |
<?php $filename = 'demo.txt'; if (file_exists($filename)) { echo '$filename文件的上次访问时间是:' . date("Y-m-d H:i:s", fileatime($filename)); echo '$filename文件的创建时间是: ' . date("Y-m-d H:i:s", filectime($filename)); echo '$filename文件的修改时间是: ' . date("Y-m-d H:i:s", filemtime($filename));} ?>
文件常用函数和常量
文件操作的常量
下面这一个常量是最常用的。是文件目录的分割符的常量。
我们来看看格式:
平台 分割符
windows \
类unix /
windows 的路径格式为 d:\xxx\xxx 注意:windows支持 d:/xxx/xxx
linux 的路径格式为 /home/xxx/xxx 注意:如果\home\xxx\xxx 在linux上是错误的
所以当你开启转义之类的话,转义字符 \ 用一起的话 d:\xxx\xxx 是一样的。判断时候有两个 \ 有的话 再转成一个\ 再把 \ 替换成 /当路径分割,这样在linux上或者windos上的路径就能保持统一了。
我们会使用到一个常量:
DIRECTORY_SEPARATOR
我们来写一个小的实例,定义当前文件所在的路径:
由于FILE是PHP的预定义常量,所以没办法改变,如果需要让FILE也自适应操作系统。
那么就是不要用FILE,可以用自定义的常量,并且把FILE处理一下,如下:
<?php $_current_file = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, __FILE__); define('__CUR_FILE__', $_current_file); echo __CUR_FILE__; ?>
文件指针操作函数
rewind ( resource handle)
功能:指针回到开始处
fseek ( resource handle, int offset [, int from_where])
功能:文件指针向后移动指定字符
我们在之前的读取当中我们发现fread读取指定长度的数据。读取指定长度的内容,下次再读取的时候从原位置开始再接着向后读取。
文件锁机制
文件锁机制一般在单一打开文件的时候根本看不到效果。这一块的学习有一点点抽象。
大家不要去思考怎么实现的呀?
为什么看不到效果呀?
答:因为电脑的操作太快了,基本上是毫秒级的。所以这个实验其实是看不到效果的。
这一章了解文件锁的基本概念即可****,熟悉文件锁函数和锁机制。
文件锁的用途:
若一个人在写入一个文件,另外一个人同时也打个了这个文件进行写入文件。
这情况下,如果遇到一定的碰撞概率的话,不知道到底谁的操作为准。
因此,这个时候我们引入锁机制。
若用户A在写入或者读取这个文件的时候,将文件加上共享锁。我可以读,其他人也可以读。
但是,我如果这与的时候。我使用独占锁。这个文件归我了,你们都别动,除非我将文件锁进行释放。
注意:不论加上了文件锁后要注意释放。
我们来看看这个函数:
bool flock ( resource $handle , int $operation)
功能:轻便的咨询文件锁定
我们来看看锁类型:
锁类型 |
说明 |
LOCK_SH |
取得共享锁定(读取的程序) |
LOCK_EX |
取得独占锁定(写入的程序 |
LOCK_UN | 释放锁定(无论共享或独占) |
我们接下来把demo.txt加上一个独占锁,进行写入操作。
<?php $fp = fopen("demo.txt", "r+"); // 进行排它型锁定 if (flock($fp, LOCK_EX)) { fwrite($fp, "文件这个时候被我独占了哟\n"); // 释放锁定 flock($fp, LOCK_UN); } else { echo "锁失败,可能有人在操作,这个时候不能将文件上锁"; } fclose($fp); ?>
说明:
1.上例中我为了写入文件,把文件加上了独占锁。
2.如果我操作完成,写入完成后,解除掉了独占锁。
3.如果是在读取文件的时候,大家可加按照同样的处理思路加上共享锁。
目录处理函数
之前我们处理的全都是文件,那目录和文件夹怎么处理呢?
我们就来学习目录或者称为文件夹的处理相关函数。
处理文件夹的基本思想如下:
1.读取某个路径的时候判断是否是文件夹
2.是文件夹的话,打开指定文件夹,返回文件目录的资源变量
3.使用readdir读取一次目录中的文件,目录指针向后偏移一次
4.使用readdir读取到最后,没有可读的文件返回false
5.关闭文件目录
我们来学习一比常用函数:
函数名 | 功能 |
opendir |
打开文件夹,返回操作资源 |
readdir | 读取文件夹资源 |
is_dir |
判断是否是文件夹 |
closedir |
关闭文件夹操作资源 |
filetype |
显示是文件夹还是文件,文件显示file,文件夹显示dir |
<?php //设置打开的目录是D盘 $dir = "d:/"; //判断是否是文件夹,是文件夹 if (is_dir($dir)) { if ($dh = opendir($dir)) { //读取一次向后移动一次文件夹指针 echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; //读取到最后返回false //关闭文件夹资源 closedir($dh); } } ?>
即然是读取一次向后移动一次,我们是不是可以
<?php //设置打开的目录是D盘 $dir = "d:/"; //判断是否是文件夹,是文件夹 if (is_dir($dir)) { if ($dh = opendir($dir)) { //读取到最后返回false,停止循环 while (($file = readdir($dh)) !== false) { echo "文件名为: $file : 文件的类型是: " . filetype($dir . $file) . "<br />"; } closedir($dh); } } ?>
文件权限设置
文件权限设置的函数在系统管理级别的软件中很常用。例如:某个文件不准许guest组(来宾用户)查看呀。
在企业管理中,某些用户或者某些用户文件只准读取不准修改。这都是非常常用的功能。
注:
1.本章为了解章节。如果没有学习过linux会有些吃力,可以跳过本章,了解有这个东西即可。
2.在实际生产环节中用处较少。
3.主要针对在linux下有过全面知识体系的同学可以重点学习。
4.windows下面有些功能无法实现。
函数 |
功能说明 |
chmod |
修改读取模式 |
chgrp |
修改用户组 |
chown | 修改权限 |
上面的函数用法与linux的权限操作的用法一样。
对于学过linux的同学来说学起来比较简单。没有学过的会有些吃力。
我只讲一个例子,看看如何来修改权限:
chmod 主要是修改文件的的权限
<?php //修改linux 系统/var/wwwroot/某文件权限为755 chmod("/var/wwwroot/index.html", 755); chmod("/var/wwwroot/index.html", "u+rwx,go+rx"); chmod("/somedir/somefile", 0755); ?>
文件路径函数
我们经常会遇到处理文件路径的情况。
例如:
1.文件后缀需要取出来
2.路径**需要取出名字不取目录**
3.只需要取出路径名中的**目录路径**
4.或者把网址中的各个部份进行解析取得独立值
5.甚至是自己组成一个url出来
... ....
很多地方都需要用路径处理类的函数。
我们把常用的路径处理函数为大家做了标注,大家对着这个路径处理函数进行处理即可:
函数名 功能 pathinfo 返回文件的各个组成部份 basename 返回文件名 dirname 文件目录部份 parse_url 网址拆解成各部份 http_build_query 生成url 中的query字符串 http_build_url 生成一个url
pathinfo array pathinfo ( string $路径)
功能:传入文件路径返回文件的各个组成部份
我们用具体的示例来用一下:
<?php $path_parts = pathinfo('d:/www/index.inc.php'); echo '文件目录名:'.$path_parts['dirname']."<br />"; echo '文件全名:'.$path_parts['basename']."<br />"; echo '文件扩展名:'.$path_parts['extension']."<br />"; echo '不包含扩展的文件名:'.$path_parts['filename']."<br />"; ?>
结果如下:
文件目录名:d:/www
文件全名:lib.inc.php
文件扩展名:php
不包含扩展的文件名:lib.inc
basename
string basename ( string $路径[, string $suffix ])
功能:传入路径返回文件名
第一个参数传入路径。
第二个参数,指定我文件名到了指定字符停止。
<?php echo "1: ".basename("d:/www/index.d", ".d").PHP_EOL; echo "2: ".basename("d:/www/index.php").PHP_EOL; echo "3: ".basename("d:/www/passwd").PHP_EOL; ?>
执行结果如下
1: index 2: index.php 3: passwd
dirname
dirname(string $路径)
功能:返回文件路径的文件目录部份
<?php dirname(__FILE__); ?>
结论:你可以执行看看是不是返回了文件的目录部份。
parse_url
mixed parse_url ( string $路径 )
功能:将网址拆解成各个部份
<?php $url = 'http://username:password@hostname:9090/path?arg=value#anchor'; var_dump(parse_url($url)); ?>
结果如下:
array(8) { ["scheme"]=> string(4) "http" ["host"]=> string(8) "hostname" ["port"]=> int(9090) ["user"]=> string(8) "username" ["pass"]=> string(8) "password" ["path"]=> string(5) "/path" ["query"]=> string(9) "arg=value" ["fragment"]=> string(6) "anchor" }
http_build_query
string http_build_query ( mixed $需要处理的数据)
功能:生成url 中的query字符串
<?php //定义一个关联数组 $data = [ 'username'=>'php', 'area'=>'hubei' ]; //生成query内容 echo http_build_query($data); ?>
结果如下:
username=php&area=hubei
http_build_url()
功能: 生成一个url
注:
PHP_EOL 常量
在 windows平台相当于 echo "\r\n";
在unix\linux平台相当于 echo "\n";
在mac平台相当于 echo "\r";
php实现文件留言本
我们讲完了这么多关于文件处理的系统,可是我们连一个最基本的小东西都写不出来。
从这一节开始,大家会发现大家能够写越来越多的东西了。
接下来我们我们来看看演示效果:
在下面一个界面中写入留言内容的表单界面:
存在留言后的展示界面:
我们来看一下文件结构:
index.php ---展示输入框和留言内容
write.php ---向message.txt写入数据
message.txt ---存入聊天内容
index.php文件
<?Php //设置时区 date_default_timezone_set('PRC'); //读了内容 @$string = file_get_contents('message.txt'); //如果$string 不为空的时候执行,也就是message.txt中有留言数据 if (!empty($string)) { //每一段留言有一个分格符,但是最后多出了一个&^。因此,我们要将&^删掉 $string = rtrim($string, '&^'); //以&^切成数组 $arr = explode('&^', $string); //将留言内容读取 foreach ($arr as $value) { //将用户名和内容分开 list($username, $content, $time) = explode('$#', $value); echo '用户名为<font color="gree">' . $username . '</font>内容为<font color="red">' . $content . '</font>时间为' . date('Y-m-d H:i:s', $time); echo '<hr />'; } } ?> <h1>基于文件的留言本演示</h1> <form action="write.php" method="post"> 用户名:<input type="text" name="username" /><br /> 留言内容:<textarea name="content"></textarea><br /> <input type="submit" value="提交" /> </form>
看了刚刚的展示内容,我们知道文件存储时:
1.段与段之间进行了分割
2.内容与用户之前用一个特殊的符号进行了分割
下面我们来写write.php写入留言至文件的代码:
<?php //追加方式打开文件 $fp=fopen('message.txt','a'); //设置时间 $time=time(); //得到用户名 $username=trim($_POST['username']); //得到内容 $content=trim($_POST['content']); //组合写入的字符串:内容和用户之间分开,使用$# //行与行之间分开,使用&^ $string=$username.'$#'.$content.'$#'.$time.'&^'; //写入文件 fwrite($fp,$string); //关闭文件 fclose($fp); header('location:index.php'); ?>
php实现 修改配置文件的实例
我们来看看国内知名论坛discuz的安装界面:
在这儿安装,它怎么就修改了config.inc.php文件呢?
下面我们来通过几个简单的技术来揭开它所谓的神秘面纱!
文件规划:
1.index.php -- 展示修改界面
2.edit.php -- 修改功能代码
3.config.php -- 实际的修改部份
index.php 展示修改界面。将config.php中的配置项展示出来。展示到表单中:
<?php include 'config.php'; ?> <form action="edit.php" method="post"> <input type="text" name="DB_HOST" value="<?php echo DB_HOST;?>" /><br /> <input type="text" name="DB_USER" value="<?php echo DB_USER;?>" /><br /> <input type="text" name="DB_PWD" value="<?php echo DB_PWD;?>" /><br /> <input type="text" name="DB_NAME" value="<?php echo DB_NAME;?>" /><br /> <input type="submit" value="修改" /> </form>
2.edit.php 读取config.php文件,将这个文件视为字符串。我然后使用正则表达示匹配来修改内容。
<?php $string=file_get_contents('config.php'); //DB_HOST localhost foreach($_POST as $key=>$val){ //定义正则来查找内容,这里面的key为form表单里面的name $yx="/define\('$key','.*?'\);/"; //将内容匹配成对应的key和修改的值 $re="define('$key','$val');"; //替换内容 $string=preg_replace($yx,$re,$string); } //写入成功 file_put_contents('config.php',$string); echo '修改成功'; ?>
config.php 实际存储配置文件的部份,存储了真实的config.php文件内容:
<?php define('DB_HOST','localhost'); define('DB_USER','root'); define('DB_PWD','root'); define('DB_NAME','neirong'); ?>