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


    注:最后有面试挑战,看看自己掌握了吗

    🍃博主昵称:一拳必胜客
    🌸博主寄语:欢迎点赞收藏关注哦,一起成为朋友一起成长;
     特别鸣谢:木芯工作室
    特别鸣谢:木芯工作室 、Ivan from Russia


    文件系统

    我们会点鼠标右键删除文件、会control+c(或右键)复制、粘贴文件,会新建一些文件,检测这个文件是不是只读文件。

    在电脑里面进行的这些操作,在代码里面如果能操作就好了。

    因为,如果有了这些操作。我们能做很多事情了:

    可不可以写入修改配置文件
    是不是可以做PHP安装的时候检测文件的权限
    是不是可以做生成Html文件等等很多不同的操作
    … 其他太多太多的地方用到了文件操作。

    学习文件处理本质上面就是学习文件处理的函数。再结合之前写的代码,完善自己的业务处理能力。

    读取文件

    
       //linux类的读了方式
       readfile("/home/paul/test.txt");
       //windows类的读取方式
       readfile("c:\\boot.ini");
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意:上面的代码中windows的斜线是\斜线,可能会转义掉一些字符。因此,我们写的时候写上两个斜线。

    file_get_contents($filename);

    
    
       $filename = 'NoAlike.txt';
       $filestring = file_get_contents($filename);
       echo $filestring;
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    fopen、fread、fclose操作读取文件

    上面file_get_contents打开文件的方式简单、粗暴。下面的

    resource fopen ( string $文件名, string 模式)
    
    string fread ( resource $操作资源, int 读取长度)
    
    bool fclose ( resource $操作资源 )
    
    • 1
    • 2
    • 3
    • 4
    • 5

    通过上面的函数我们来讲解资源类型的通常操作方式:

    1.打开资源

    2.使用相关函数进行操作

    3.关闭资源

    fopen函数 fopen函数的功能是打开文件,参数主要有两个:

    1.文件打开的路径

    2.打开文件的模式

    返回类型是一个资源类型,我们第一次遇到了之前基础类型的时候讲到的资源类型。
    资源类型需要其他的函数来操作这个资源。所有的资源有打开就要有关闭。

    fread函数 函数的功能的功能是读取打开的文件资源。读取指定长度的文件资源,读取一部份向后移动一部份。至到文件结尾。

    fclose函数 fclose函数的功能是关闭资源。资源有打开就有关闭。

    了解完函数,后两个函数比较简单。而fopen函数的模式到底是什么,fopen的模式有下面几个,我们来讲一下fopen的模式:

    模式	说明
    r	只读方式打开,将文件指针指向文件头。
    r+	读写方式打开,将文件指针指向文件头。
    w	写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建
    w+	读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建
    a	写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建
    a+	读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之
    x	创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建
    x+	
    创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    接下来,我们只来学习r模式,下结课我们在将写入的时候再来讲讲其他几个模式。

    我们先会读取文件了,才能很好的掌握写入文件。

    1.打开文件

    
       //你可以创建一个NoAlike.txt,以只读模式打开
       $fp = fopen('NoAlike.txt', "r");
       //var_dump()操作一下$fp看看效果,输出的是不是只有类型提示的是resource
       var_dump($fp);
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.读取文件

    
       $fp = fopen('NoAlike.txt', "r");
    
       //打开一个文件类型后,读取长度
       $contents = fread($fp, 1024);
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.关闭文件

    
       $fp = fopen($filename, 'r');
       $contents = fread($fp, 1024);
       fclose($fp);
       echo $contents;
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其他注意事项:

    模式 说明

    t	windows下将\n转为\r\n
    b	二进制打开模式
    
    • 1
    • 2

    说明:

    实验无法让肉眼看到这个实验效果。大家记住有这个特点即可。

    Windows 下提供了一个文本转换标记(‘t’)可以透明地将 \n 转换为 \r\n。
    与此对应还可以使用 ‘b’ 来强制使用二进制模式,这样就不会转换数据。要使用这些标记,要么用 ‘b’ 或者用 ‘t’ 作为 mode 参数的最后一个字符。

    创建和修改文件内容

    上一节当中我们学习了读取文件特别好掌握。这一节当中我们来讲解的是写入文件。

    file_put_contents写入文件

    我们先来学习第一种写入文件的方式:

    int file_put_contents ( string $文件路径, string $写入数据])
    
    • 1

    功能:向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度

    创建和修改文件内容
    上一节当中我们学习了读取文件特别好掌握。这一节当中我们来讲解的是写入文件。
    
    file_put_contents写入文件
    
    
    我们先来学习第一种写入文件的方式:
    
    int file_put_contents ( string $文件路径, string $写入数据])
    
    功能:向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度
    
    <?php
       $data = "在PHP中文网学好PHP,妹子票子不再话下!";
    
       $numbytes = file_put_contents('binggege.txt', $data);
    
       if($numbytes){
    
           echo '写入成功,我们读取看看结果试试:';
    
           echo file_get_contents('binggege.txt');
    
       }else{
           echo '写入失败或者没有权限,注意检查';
       }
    ?>
    我们发现写入文件也挺简单的。按照这个函数的格式,指定文件,写入字符串数据就可以了。
    
    fwrite配合fopen进行写入操作
    
    
    int fwrite ( resource $文件资源变量, string $写入的字符串 [, int 长度])
    
    注:fwrite的别名函数是fputs
    
    我们上节课试了r模式,只道是读取的时候使用,接下来我们用fwrite加上fopen中的w,写入模式来进行文件写入。
    
    我们来看一下特点:
    
    写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建。
    
    注意:在下面的实验中,你可以试试新建个test.txt文件向里面写入内容。然后,可以试试把test.txt删除。看看有什么提示。
    
    <?php
       $filename = 'test.txt';
       $fp= fopen($filename, "w");
       $len = fwrite($fp, '我是一只来自北方的狼,却在南方冻成了狗');
       fclose($fp);
       print $len .'字节被写入了\n';
    ?>
    总结:
    1.不论有没有新建都会打开文件重新写入
    2.原有的文件内容会被覆盖掉
    3.文件不存在会创建
    
    那我们来对比一下以下几个模式的不同:
    
    模式	说明
    r	只能读不能使用fwrite写
    r+	可操作读、写
    w	只可以写功能
    w+	即可读又可以写
    我们来通过实验证明一下:
    
    <?php
       $filename = 'test.txt';
       $fp= fopen($filename, "r+");
       $len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘');
       fclose($fp);
       print $len .'字节被写入了\n';
    ?>
    实验时可以把r后面的+号去掉。
    
    我们通过实验,确实发现使用r模式,在文件存的时候可以进行写入数据,只用r的话,写入是不成功的。
    
    a模式和w模式的不同
    
    同样是下面的这段代码,我们改为a模式。
    
    <?php
       $filename = 'test.txt';
       $fp= fopen($filename, "a");
       $len = fwrite($fp,'读大学迷茫了,PHP中文网学PHP给你希望');
       echo  $len .'字节被写入了\n';
    ?>
    打开网页执行这段代码,你会发现:每刷新一次,文件中就会多一段
    :读大学迷茫了,PHP中文网学PHP给你希望。
    
    总结:
    
    模式	总结
    x	每次写入会干掉原有文件的内容,文件不存在都会创建
    a	每次写入都会向文件的尾端追加内容
    注:a+ 是增强的追加功能。可以读取时也可以使用。
    
    x模式和w模式的不同
    
    这段代码我们再实验一次,改为x模式:
    
    <?php
       $filename = 'test.txt';
       $fp= fopen($filename, "x");
       $len = fwrite($fp,'读大学迷茫了,PHP中文网学PHP给你希望');
       echo  $len .'字节被写入了\n';
    ?>
    我们会发现:
    
        1.文件存在的时候会报错
    
        2.如果把$filename 改成其他的文件名,就可以了。但是,再次刷新的时候又报错了
    
        3.x+ 是增强的x模式。读取时也可以使用。
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114

    我们发现写入文件也挺简单的。按照这个函数的格式,指定文件,写入字符串数据就可以了。

    fwrite配合fopen进行写入操作

    int fwrite ( resource $文件资源变量, string $写入的字符串 [, int 长度])
    
    • 1
    注:fwrite的别名函数是fputs
    
    • 1

    我们上节课试了r模式,只道是读取的时候使用,接下来我们用fwrite加上fopen中的w,写入模式来进行文件写入。

    我们来看一下特点:

    写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建。

    注意:在下面的实验中,你可以试试新建个test.txt文件向里面写入内容。然后,可以试试把test.txt删除。看看有什么提示。

    
       $filename = 'test.txt';
       $fp= fopen($filename, "w");
       $len = fwrite($fp, '我是一只来自北方的狼,却在南方冻成了狗');
       fclose($fp);
       print $len .'字节被写入了\n';
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    总结:
    1.不论有没有新建都会打开文件重新写入
    2.原有的文件内容会被覆盖掉
    3.文件不存在会创建

    那我们来对比一下以下几个模式的不同:

    模式	说明
    r	只能读不能使用fwrite写
    r+	可操作读、写
    w	只可以写功能
    w+	即可读又可以写
    我们来通过实验证明一下:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    
       $filename = 'test.txt';
       $fp= fopen($filename, "r+");
       $len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘');
       fclose($fp);
       print $len .'字节被写入了\n';
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    实验时可以把r后面的+号去掉。

    我们通过实验,确实发现使用r模式,在文件存的时候可以进行写入数据,只用r的话,写入是不成功的。

    a模式和w模式的不同

    同样是下面的这段代码,我们改为a模式。

    
       $filename = 'test.txt';
       $fp= fopen($filename, "a");
       $len = fwrite($fp,'读大学迷茫了,PHP中文网学PHP给你希望');
       echo  $len .'字节被写入了\n';
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    打开网页执行这段代码,你会发现:每刷新一次,文件中就会多一段
    :读大学迷茫了,PHP中文网学PHP给你希望。

    总结:

    模式 总结

    **x	每次写入会干掉原有文件的内容,**文件不存在都会创建
    a	每次写入都会向文件的尾端追加内容
    注:a+ 是增强的追加功能。可以读取时也可以使用。
    
    • 1
    • 2
    • 3

    x模式和w模式的不同

    这段代码我们再实验一次,改为x模式:

    
       $filename = 'test.txt';
       $fp= fopen($filename, "x");
       $len = fwrite($fp,'读大学迷茫了,PHP中文网学PHP给你希望');
       echo  $len .'字节被写入了\n';
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    我们会发现:

    1.文件存在的时候会报错
    
    2.如果把$filename 改成其他的文件名,就可以了。但是,再次刷新的时候又报错了
    
    3.x+ 是增强的x模式。读取时也可以使用。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建临时文件

    我们之前创建的文件都是永久文件。

    而创建临时文件在我们平时的项目开发中也非常有用。创建临时文件的几个好处:

    文完后即删除

    不需要去维护这个文件的删除状态

    例如:我需要把A的文件内容转存B里面,把B的文件内容转存到C里面。

    就跟现实生活中一样,我可以先用一个临时的瓶子把B的水装起来,然后把A的数据写入到B里面。把临时瓶子的水追加到C里面。

    我们来学习一下这个函数:

    resource tmpfile ( )
    
    • 1

    功能:创建一个临时文件,返回资源类型。关闭文件即被删除。

    
       //创建了一个临时文件
       $handle = tmpfile();
    
       //向里面写入了数据
       $numbytes = fwrite($handle, '写入临时文件');
    
       //关闭临时文件,文件即被删除
       fclose($handle);
    
       echo  '向临时文件中写入了'.$numbytes . '个字节';
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    移动、拷贝和删除文件

    我们日常在处理文件的时候,可以删除文件、重命名文件也可以也可复制文件。

    那这这一节,我们就来讲解我们日常生活当中最常用到的一些操作

    我们先来说重命名,重命名的函数是:

    重命名文件

    bool rename($旧名,$新名);
    
    • 1

    这个函数返回一个bool值,将旧的名字改为新的名字。

    
       //旧文件名
       $filename = 'test.txt';
    
       //新文件名
       $filename2 = $filename . '.old';
    
       //复制文件
       rename($filename, $filename2);
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    我们打开目录,我们可以看看效果,你会发现把指定的文件,复制了一份到了目标路径。

    复制文件

    复制文件,就相当于是克隆技术,将一个原来的东西再克隆成一个新的东西。两个长得一模一样。

    bool copy(源文件,目标文件)
    
    • 1

    功能**:将指定路径的源文件,复制一份到目标文件的位置。**

    我们来通过实验和代码来玩玩:

    
       //旧文件名
       $filename = 'copy.txt';
    
       //新文件名
       $filename2 = $filename . '_new';
    
       //修改名字。
       copy($filename, $filename2);
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    总结:
    你会通过上面的例子,发现多出来了一个文件。

    删除文件

    删除文件就是将指定路径的一个文件删除,不过这个删除是直接删除。使用的是windows电脑,你在回收站看不到这个文件。

    你只会发现,这个文件消失了。

    bool unlink(指定路径的文件)

    
       $filename = 'test.txt';
    
       if (unlink($filename)) {
           echo  "删除文件成功 $filename!\n";
       } else {
           echo "删除 $filename 失败!\n";
       }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    检测文件属性函数

    有些同学特别好奇,**检测文件属性用在什么地方。**检测文件属性能用到的地方太多了。

    我们来举例子:

    1.我们在做软件安装的时候,大家会发现如果文件存在了,就跳转到了其他的地方
    2.如果在安装的过程当中,某些文件没有写入权限,就不让进行安装

    我们来举一个国内非常出名的软件discuz的安装过程截图给大家看看:

    在这里插入图片描述
    上面的例子,就是典型的文件检测的用法。

    我们来学习一下下面的**一批函数。**然后,我们来通过一个例子进行学习。

    bool file_exists ( $指定文件名或者文件路径)
    功能:文件是否存在。
    
    bool is_readable ( $指定文件名或者文件路径)
    功能:文件是否可读
    
    bool is_writeable ( $指定文件名或者文件路径)
    功能:文件是否可写
    
    bool is_executable ( $指定文件名或者文件路径)
    功能:文件是否可执行
    
    bool is_file ( $指定文件名或者文件路径)
    功能:是否是文件
    
    bool is_dir ( $指定文件名或者文件路径)
    功能:是否是目录
    
    void clearstatcache ( void )
    功能:清楚文件的状态缓存
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    上面的功能一看就清楚了。那实验,我们就来写这个最开始我们举的这个例子。

    文件锁

    我们来讲**第一个例子,文件锁。**如果已经安装了,存在安装锁就提示已安装否则就继续安装。

    我们假设安装界面的网址是:install.php,安装的锁文件是install.lock。我们就可以检测install.lock文件是否存在

    
    
    if(file_exists('install.lock')){
    
       echo '已安装,请不要再次进行安装';
       exit;
    
    }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    检测文件或目录是否有写入或者读取权限

    我们接下来做一个文件安装检测的实验来检测文件或目录是否有写入或者读取权限。如果没有则不能进行安装。

    处理这件事情的思路如下:

    1.定义一批需要检测权限的数组
    
    2.可以检测是文件夹还是文件
    
    3.做一个标置位变量,如果标置位变量一旦为false则不显示下一步的安装
    
    • 1
    • 2
    • 3
    • 4
    • 5
    
    //可以定义一批文件是否存在
    $files = [
       'config.php',
       'img/',
       'uploads/',
    ];
    //定义标志位变量
    $flag = true;
    foreach($files as  $v){
       echo $v;
       //判断是文件还是文件夹
       if(is_file($v)){
           echo '是一个文件    ';
       }else if(is_dir($v)){
           echo '是一个文件夹    ';
       }
       if(is_readable($v)){
           echo ' 可读';
       }else{
            echo '不可读';
       }
       if(is_writeable($v)){
           echo '可写';
       }else{
           echo '不可写';
       }
       echo '
    '
    ; } if($flag){ echo '下一步'; }else{ echo '不能进行安装'; } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    通过上面的例子,我们就做到了。实现PHP某个软件安装过程当中的安装检测

    也就是我们上面思路的实现。

    文件的时间函数

    函数 功能说明

    filectime	文件创建时间
    filemtime	文件修改时间
    fileatime	文件上次访问时间
    
    • 1
    • 2
    • 3
    
    
    $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));}
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    文件常用函数和常量

    文件操作的常量

    下面这一个常量是最常用的。是文件目录的分割符的常量

    我们来看看格式:

    平台	分割符
    windows	\
    类unix	/
    
    • 1
    • 2
    • 3

    windows 的路径格式为 d:\xxx\xxx 注意:windows支持 d:/xxx/xxx
    linux 的路径格式为 /home/xxx/xxx 注意:如果\home\xxx\xxx 在linux上是错误的

    所以当你开启转义之类的话,转义字符 \ 用一起的话 d:\xxx\xxx 是一样的。判断时候有两个 \ 有的话 再转成一个\ 再把 \ 替换成 /当路径分割,这样在linux上或者windos上的路径就能保持统一了。

    我们会使用到一个常量:

    DIRECTORY_SEPARATOR
    
    • 1

    我们来写一个小的实例,定义当前文件所在的路径:

    由于FILE是PHP的预定义常量,所以没办法改变,如果需要让FILE也自适应操作系统
    那么就是不要用FILE,可以用自定义的常量,并且把FILE处理一下,如下:

    
    $_current_file = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, __FILE__);
    define('__CUR_FILE__', $_current_file);
    
    echo __CUR_FILE__;
    
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    文件指针操作函数

    rewind ( resource handle)
    
    • 1

    功能:指针回到开始处

    fseek ( resource handle, int offset [, int from_where])
    
    • 1

    功能:文件指针向后移动指定字符

    我们在之前的读取当中我们发现fread读取指定长度的数据。读取指定长度的内容,下次再读取的时候从原位置开始再接着向后读取。

    文件锁机制

    文件锁机制一般在单一打开文件的时候根本看不到效果。这一块的学习有一点点抽象。

    大家不要去思考怎么实现的呀?

    为什么看不到效果呀?
    答:因为电脑的操作太快了,基本上是毫秒级的。所以这个实验其实是看不到效果的。

    这一章了解文件锁的基本概念即可****,熟悉文件锁函数和锁机制。

    文件锁的用途:

    一个人在写入一个文件另外一个人同时也打个了这个文件进行写入文件
    这情况下,如果遇到一定的碰撞概率的话,不知道到底谁的操作为准。
    因此,这个时候我们引入锁机制
    若用户A在写入或者读取这个文件的时候,将文件加上共享锁我可以读,其他人也可以读
    但是,我如果这与的时候。我使用独占锁。这个文件归我了,你们都别动,除非我将文件锁进行释放。

    注意:不论加上了文件锁后要注意释放。

    我们来看看这个函数:

    bool flock ( resource $handle , int $operation)
    
    • 1

    功能:轻便的咨询文件锁定

    我们来看看锁类型:

    锁类型 说明

    LOCK_SH	取得共享锁定(读取的程序)
    LOCK_EX	取得独占锁定(写入的程序
    LOCK_UN	释放锁定(无论共享或独占)
    
    • 1
    • 2
    • 3

    我们接下来把demo.txt加上一个独占锁进行写入操作

    
    
    $fp = fopen("demo.txt", "r+");
    
    // 进行排它型锁定
    if (flock($fp, LOCK_EX)) { 
    
       fwrite($fp, "文件这个时候被我独占了哟\n");
    
      // 释放锁定
       flock($fp, LOCK_UN);    
    } else {
       echo "锁失败,可能有人在操作,这个时候不能将文件上锁";
    }
    
    fclose($fp);
    
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    说明:

    1.上例中我为了写入文件,把文件加上了独占锁

    2.如果我操作完成,写入完成后,解除掉了独占锁。

    3.如果是在读取文件的时候,大家可加按照同样的处理思路加上共享锁。

    目录处理函数

    之前我们处理的全都是文件,那目录和文件夹怎么处理呢?

    我们就来学习目录或者称为文件夹的处理相关函数

    处理文件夹的基本思想如下:

    1.读取某个路径的时候判断是否是文件夹
    
    2.是文件夹的话,打开指定文件夹,返回文件目录的资源变量
    
    3.使用readdir读取一次目录中的文件,目录指针向后偏移一次
    
    4.使用readdir读取到最后,没有可读的文件返回false
    
    5.关闭文件目录
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    我们来学习一比常用函数:

    函数名	功能
    opendir	打开文件夹,返回操作资源
    readdir	读取文件夹资源
    is_dir	判断是否是文件夹
    closedir	关闭文件夹操作资源
    filetype	显示是文件夹还是文件,文件显示file,文件夹显示dir
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    
    //设置打开的目录是D盘
    $dir = "d:/";
    
    //判断是否是文件夹,是文件夹
    if (is_dir($dir)) {
       if ($dh = opendir($dir)) {
    
          //读取一次向后移动一次文件夹指针
          echo readdir($dh).'
    '
    ; echo readdir($dh).'
    '
    ; echo readdir($dh).'
    '
    ; echo readdir($dh).'
    '
    ; //读取到最后返回false //关闭文件夹资源 closedir($dh); } } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    即然是读取一次向后移动一次,我们是不是可以

    
    //设置打开的目录是D盘
    $dir = "d:/";
    
    //判断是否是文件夹,是文件夹
    if (is_dir($dir)) {
       if ($dh = opendir($dir)) {
    
    
          //读取到最后返回false,停止循环
          while (($file = readdir($dh)) !== false) {
               echo "文件名为: $file : 文件的类型是: " . filetype($dir . $file) . "
    "
    ; } closedir($dh); } } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    文件权限设置

    文件权限设置的函数在系统管理级别的软件中很常用。例如:某个文件不准许guest组(来宾用户)查看呀。

    企业管理中,某些用户或者某些用户文件只准读取不准修改。这都是非常常用的功能。

    注:

    1.本章为了解章节。如果没有学习过linux会有些吃力,可以跳过本章,了解有这个东西即可。
    
    2.在实际生产环节中用处较少。
    
    3.主要针对在linux下有过全面知识体系的同学可以重点学习。
    
    4.windows下面有些功能无法实现。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    函数	功能说明
    chmod	修改读取模式
    chgrp	修改用户组
    chown	修改权限
    
    • 1
    • 2
    • 3
    • 4

    上面的函数用法与linux的权限操作的用法一样。
    对于学过linux的同学来说学起来比较简单。没有学过的会有些吃力。

    我只讲一个例子,看看如何来修改权限:

    chmod 主要是修改文件的的权限

    
    //修改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
    • 6

    文件路径函数

    我们经常会遇到处理文件路径的情况。

    例如:

    1.文件后缀需要取出来
    
    2.路径**需要取出名字不取目录**
    
    3.只需要取出路径名中的**目录路径**
    
    4.或者把网址中的各个部份进行解析取得独立值
    
    5.甚至是自己组成一个url出来
    ... ....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    很多地方都需要用路径处理类的函数。

    我们把常用的路径处理函数为大家做了标注,大家对着这个路径处理函数进行处理即可

    函数名	功能
    pathinfo	返回文件的各个组成部份
    basename	返回文件名
    dirname	文件目录部份
    parse_url	网址拆解成各部份
    http_build_query	生成url 中的query字符串
    http_build_url	生成一个url
    pathinfo
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    array pathinfo ( string $路径)
    
    • 1

    功能:传入文件路径返回文件的各个组成部份
    我们用具体的示例来用一下:

    
    $path_parts = pathinfo('d:/www/index.inc.php');
    
    echo '文件目录名:'.$path_parts['dirname']."
    "
    ; echo '文件全名:'.$path_parts['basename']."
    "
    ; echo '文件扩展名:'.$path_parts['extension']."
    "
    ; echo '不包含扩展的文件名:'.$path_parts['filename']."
    "
    ; ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    结果如下:

    文件目录名:d:/www
    文件全名:lib.inc.php
    文件扩展名:php
    不包含扩展的文件名:lib.inc
    basename
    
    • 1
    • 2
    • 3
    • 4
    • 5
    string basename ( string $路径[, string $suffix ])
    
    • 1

    功能:传入路径返回文件名
    第一个参数传入路径。
    第二个参数,指定我文件名到了指定字符停止。

     
    
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    执行结果如下

    1: index
    2: index.php
    3: passwd
    
    • 1
    • 2
    • 3

    dirname

    dirname(string $路径) 
    
    • 1

    功能:返回文件路径的文件目录部份

     
    dirname(__FILE__); 
    ?>
    
    • 1
    • 2
    • 3

    结论:你可以执行看看是不是返回了文件的目录部份。

    parse_url

    mixed parse_url ( string $路径 )
    
    • 1

    功能:将网址拆解成各个部份

    
    $url = 'http://username:password@hostname:9090/path?arg=value#anchor';
    
    var_dump(parse_url($url));
    
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果如下:

    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"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    http_build_query

    string http_build_query ( mixed $需要处理的数据)
    
    • 1

    功能:生成url 中的query字符串

    
    //定义一个关联数组
    $data = [
           'username'=>'php',
           'area'=>'hubei'
            ];
    
    //生成query内容
    echo http_build_query($data);
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    结果如下:

    username=php&area=hubei
    
    • 1

    http_build_url()

    功能: 生成一个url

    注:

    PHP_EOL 常量
    在 windows平台相当于 echo "\r\n";
    在unix\linux平台相当于 echo "\n";
    在mac平台相当于 echo "\r";
    
    • 1
    • 2
    • 3
    • 4

    php实现文件留言本

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

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

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

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

    在这里插入图片描述

    存在留言后的展示界面:

    在这里插入图片描述

    我们来看一下文件结构:

    index.php ---展示输入框和留言内容
    write.php ---向message.txt写入数据
    message.txt ---存入聊天内容
    
    • 1
    • 2
    • 3

    index.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 '用户名为' . $username . '内容为' . $content . '时间为' . date('Y-m-d H:i:s', $time);
            echo '
    '
    ; } } ?> <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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    看了刚刚的展示内容,我们知道文件存储时:

    1.段与段之间进行了分割
    
    2.内容与用户之前用一个特殊的符号进行了分割
    
    • 1
    • 2
    • 3

    下面我们来写write.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');
    
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    php实现 修改配置文件的实例

    我们来看看国内知名论坛discuz的安装界面

    在这儿安装,它怎么就修改了config.inc.php文件呢?
    在这里插入图片描述

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

    文件规划:

    1.index.php -- 展示修改界面
    
    2.edit.php -- 修改功能代码
    
    3.config.php -- 实际的修改部份
    
    • 1
    • 2
    • 3
    • 4
    • 5

    index.php 展示修改界面将config.php中的配置项展示出来。展示到表单中:

    
    
        include 'config.php';
    
    ?>
    
    
    <form action="edit.php" method="post">
    <input type="text" name="DB_HOST" value="" /><br />
    <input type="text" name="DB_USER" value="" /><br />
    <input type="text" name="DB_PWD" value="" /><br />
    <input type="text" name="DB_NAME" value="" /><br />
    
    
    <input type="submit" value="修改" />
    
    </form>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.edit.php 读取config.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 '修改成功';
    
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    config.php 实际存储配置文件的部份,存储了真实的config.php文件内容

    
    
    define('DB_HOST','localhost');
    
    define('DB_USER','root');
    
    define('DB_PWD','root');
    
    define('DB_NAME','neirong');
    
    
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    你是不是发现,这些其实并没有想象中的那么难。结合一下正则表达示和文件的知识就做到了!

  • 相关阅读:
    体验SOLIDWORKS钣金切口工具增强 硕迪科技
    该微信用户未开启“公众号安全助手”的消息接收功能,请先开启后再绑定,Java微信公众号开发消息推送公众号&用户绑定问题 的解决办法
    不重新安装Anaconda找回不见的Anaconda Prompt
    软考高级-系统架构师-案例分析-案例题1
    JavaScript原型链
    TCP 可靠吗?为什么?
    C++数据结构X篇_25_堆排序(不稳定的排序)
    电路知识的回顾
    跟单王订单追踪软件如何打通金蝶ERP?
    程序员突如其来的生日惊喜
  • 原文地址:https://blog.csdn.net/weixin_43796670/article/details/127644691