【php学习笔记】文件系统---制作备忘录和修改配置文件(下)

简介: 【php学习笔记】文件系统---制作备忘录和修改配置文件

文件的时间函数


函数

功能说明

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);
   }
}
?>

1668337589007.jpg


文件权限设置


文件权限设置的函数在系统管理级别的软件中很常用。例如:某个文件不准许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实现文件留言本


我们讲完了这么多关于文件处理的系统,可是我们连一个最基本的小东西都写不出来。


从这一节开始,大家会发现大家能够写越来越多的东西了。


接下来我们我们来看看演示效果:


在下面一个界面中写入留言内容的表单界面:

1668337744029.jpg


存在留言后的展示界面:

1668337759649.jpg

我们来看一下文件结构:


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文件呢?

1668337816124.jpg


下面我们来通过几个简单的技术来揭开它所谓的神秘面纱!


文件规划:


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');
?>
相关文章
|
3月前
|
存储 Java 数据库连接
php学习笔记-代码基本语法-day01
本文是关于PHP编程语言的基础语法学习笔记,内容包括PHP的介绍、注释风格、数据类型、命名规范、常量和变量的使用,以及变量和常量相关的常用函数。文中详细解释了PHP的基本语法元素和一些易混淆的概念,如传值赋值与传址赋值、可变变量,以及如何检查变量是否已定义或为空。
php学习笔记-代码基本语法-day01
|
3月前
|
JavaScript 前端开发 安全
php学习笔记-普通表单参数提交获取及页面的重定向和一个登录小demo-day05
本文介绍了PHP中普通表单参数的提交获取、页面重定向的方法,并通过一个登录示例演示了表单参数的封装和页面跳转处理。
|
1月前
|
JSON PHP 数据格式
PHP解析配置文件的常用方法
INI文件是最常见的配置文件格式之一。
54 12
|
3月前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
|
3月前
|
存储 API PHP
php学习笔记-php数组的创建和使用,数组常用函数-day03
关于PHP数组的创建、使用以及常用函数的详细学习笔记。
php学习笔记-php数组的创建和使用,数组常用函数-day03
|
3月前
|
JavaScript Java PHP
php学习笔记-php运算符,类型转换,打印输出语句相较于其他语言的特殊部分-day02
本文是第二天的PHP学习笔记,涵盖了PHP中运算符的使用、类型转换方式,以及打印输出语句的特点,展示了其相较于其他编程语言的一些特殊之处。
php学习笔记-php运算符,类型转换,打印输出语句相较于其他语言的特殊部分-day02
|
3月前
|
SQL 关系型数据库 MySQL
php学习笔记-连接操作mysq数据库(基础)-day08
本文介绍了PHP中连接操作MySQL数据库的常用函数,包括连接服务器、设置字符集、关闭连接、选择数据库、结果集释放、获取影响行数以及遍历结果集等操作。通过书籍查询的实例演示了如何使用这些函数进行数据库操作,并提供了一个PHP操纵MySQL数据库的模板。
php学习笔记-连接操作mysq数据库(基础)-day08
|
3月前
|
前端开发 PHP
php学习笔记-php文件表单上传-day06
本文介绍了PHP文件上传处理流程、预定义变量`$_FILES`的使用、文件上传状态代码以及文件上传实现函数。同时,通过一个文件上传的小例子,演示了文件上传表单的创建、文件上传表单处理的PHP页面编写以及运行测试输出。
php学习笔记-php文件表单上传-day06
|
3月前
|
JavaScript 程序员 PHP
php学习笔记-php自定义函数-day05
本文介绍了PHP自定义函数的创建、调用、参数赋值以及作用域和生命周期,还探讨了`global`和`static`关键字的使用,以及`return`、`exit`和`die`的不同用法。
|
3月前
|
XML SQL PHP
php学习笔记-php字符串及字符串常用函数总结-day04
本文总结了PHP中字符串的三种定义方式和常用字符串处理函数,包括字符串的修剪、转换、长度计算、子串操作、比较、连接、分割及替换等操作。