PHP文件操作及实例:留言板

多线程大师
• 阅读 2290

一、文件操作函数
1.创建文件:touch('./xxx.php');
bool touch ( string $filename [, int $time = time() [, int $atime ]] )
2.复制文件:copy('./xxx.php','./yyy.php');
3.移动或重命名:rename('./xxx.php','./yyy.php');
4.删除文件:unlink('./xxx.php');
5.截取文件:ftruncate('./xxx.php',$size);
6.文件内容操作:

a.file_get_contents('./xxx.php');获取文件
b.file_put_contents('./xxx.php','aaa');写入文件
注:可以远程读取文件,如:file_put_contents('./xxx.php',file_get_contents('http://www.baidu.com'));
C.读文件readfile('http://www.baidu.com');
d.$arr=file('./xxx.php'):将文件存为数组,每一行是一个元素

注:以上涉及读取文件内容的函数无需先打开文件

二、文件的打开与关闭
1.$open=fopen('./xxx.php','r');
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
注:附加Mode:b操作二进制文件时加上,t文本文件
PHP文件操作及实例:留言板

2.fclose($open);
3.fwrite($open,'aaaa');可以更改fopen的mode,改变每次写入是否覆盖
4.fgetc($open);一次读取文件一个字符
5.feof($open);指针到文件结尾返回true,可用作if判断
6.fgets($open);一次读取文件一行
7.fread($open,1024);一次读取指定长度(字节数)的字符
注:以上读取文件内容必须先打开文件

while(!feof($open)){
    echo fgetc($open);
    echo fgets($open);
    echo fread($open,filesize($open));
}

三、移动文件的指针
1.ftell($open);返回指针当前位置,默认为开始
2.fseek($open,-4,SEEK_END);将指针移动至某位置,如从文件尾前移4个字节,注意结尾可能有换行符。可以配合fopen的a追加模式更方便的操作

$whence值可以是:
•SEEK_SET - 设定位置等于 offset 字节。
•SEEK_CUR - 设定位置为当前位置加上 offset。
•SEEK_END - 设定位置为文件尾加上 offset。

3.rewind($open);将指针放到开头
四、文件的锁定机制
1.flock($open,LOCK_SH):读取/写入文件时都需要锁定(LOCK_SH/LOCK_EX),以防止多人同时操作,解锁时方法相同(LOCK_UN)
注:$handle必须指向一个打开的文件资源
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )

  operation 可以是以下值之一: 
◦ LOCK_SH取得共享锁定(读取的程序)。  
◦ LOCK_EX 取得独占锁定(写入的程序。  
◦ LOCK_UN 释放锁定(无论共享或独占)。

五、实例:留言板

<?php
    $filename='message.txt';
    if(isset($_POST['dosubmit'])){
        $content="{$_POST['username']}||".time()."||{$_POST['title']}||{$_POST['content']}[n]";
        
        writeMessage($filename,$content);
    }
    if(file_exists($filename)){
        date_default_timezone_set('PRC');
        readMessage($filename);
    }
    function writeMessage($filename,$content){
        $open=fopen($filename,'a');
        if(flock($open,LOCK_EX+LOCK_NB)){//添加写入锁及防阻塞
            fwrite($open,$content);
            flock($file,LOCK_UN+LOCK_NB);//释放写入锁及防阻塞
        }else{
            echo "写入锁定失败!";
        }
        fclose($open);
    }
    function readMessage($filename){
        //不打开文件读取,无法加锁
        //$mess=rtrim(file_get_contents($filename),'[n]');
        $mess='';
        $file=fopen($filename,'r');
        if(flock($file,LOCK_SH+LOCK_NB)){//添加读取锁及防阻塞
            while(!feof($file)){
                $mess.=fread($file,1024);
            }
            flock($file,LOCK_UN+LOCK_NB);//释放读取锁及防阻塞    
        }else{
            echo "读取锁定失败!";
        }
        $mess=rtrim($mess,'[n]');
        $arr=explode('[n]',$mess);
        foreach($arr as $value){
            list($username,$time,$title,$content)=explode("||",$value);
            echo "<b>{$username}</b>,".date('y-m-d h:i',$time).":<i>{$title}</i>,<u>{$content}</u><br><hr><br>";
        }
        fclose($file);
    }
?>
<!DOCTYPE >
<html>
    <head>
        <meta charset="utf-8">
        <style>
            input{
                display: block;
            }
            textarea{
                display: block;
            }
        </style>
    </head>
    <body>
        <form action="message.php" method="post">
            <label for="uesrname">用户名:</label><input type="text" value="" name="username" id="username" />
            <label for="title">标&nbsp;&nbsp;&nbsp;题:</label><input type="text" value="" name="title" id="title" />
            <label for="content">内&nbsp;&nbsp;&nbsp;容:</label><textarea cols="40" rows="10" id="content" name="content"></textarea>
            <button type="submit" name="dosubmit">提&nbsp;交</button>
        </form>
    </body>
</html>
点赞
收藏
评论区
推荐文章
半臻 半臻
4年前
Python基础8——文件操作
16文件操作16.1文件操作的基本概念文件操作的步骤1.打开文件2.读、写文件3.关闭文件open函数,创建一个file对象,默认是以只读的方式打开read方法:一次性读取文件的所有内容write方法:将指定内容写入文件close方法:关闭文件file对象的属性flie.name文件的名称file.mode文件的访问模式file.closed
沸腾的木马 沸腾的木马
2年前
关于dorker安装的wordpress无法上传主题和插件的解决办法
首先,容器里居然没有php.ini这个文件。第二,容器里的配置文件无法编辑解决办法在php官网下载php.ini这个文件,修改后通过主机copy到容器里1、要查找容器的名称或ID,可以使用以下命令:dockerps这将显示正在运行的容器的列表,类似于以下示
Stella981 Stella981
4年前
SXSSFWorkbook使用
//1.导入excel模板StringtargetPathrs.getSession().getServletContext().getRealPath("/excelModel/"fileName".xlsx");//2.创建一个workbook,对应一个Excel文件FilefinewFile(t
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
4年前
SXSSFWorkbook使用
//1.导入excel模板StringtargetPathrs.getSession().getServletContext().getRealPath("/excelModel/"fileName".xlsx");//2.创建一个workbook,对应一个Excel文件FilefinewFile(t
Wesley13 Wesley13
4年前
PHP如何快速读取大文件
PHP如何快速读取大文件在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file\_get\_contents之类的函数,简简单单的几行代码就能很漂亮的完成我们所需要的功能。但当所操作的文件是一个比较大的文件时,这些函数可能就显的力不从心,下面将从一个需求入手来说明对于读取大文件时,常用的操作方法。需求需求有一个
Wesley13 Wesley13
4年前
ThinkPHP5.0 build 自动生成模块
提示:首先,下载的完整框架或者Composer运行创建命令生成的框架中,build.php文件默认存放于根目录下。需要复制build.php文件到application目录,并对该文件进行修改,举例如下:return//生成应用公共文件
Wesley13 Wesley13
4年前
PHP高性能编程
1.能用PHP数组完成的工作,绝不用文件形式来代替,数组是内存操作,内存操作速度对比文件操作快很多!2.判断一个数值是否在一个数组中,然后决定是否追加数组内容时,不推荐使用in\_array或者array\_key\_exists,因为函数判断都不如isset结构判断来的快!$num0;$resultar
Stella981 Stella981
4年前
Perl文件、目录常用操作
注意,这些操作的对象是文件名(相对路径/绝对路径),而非文件/目录句柄,句柄只是perl和文件系统中文件的关联通道,而非实体对象。创建文件在unix类操作系统中有一个touch命令可以非常方便的创建文件,还能批量创建一些名称规律的文件。但实际上touch的主要介绍中却是"修改文件时间戳",创建文件只不过是它的辅助能力。如果没有touch命令
Stella981 Stella981
4年前
Linux—文件命令之touch命令
下面总结一下对于文件的操作命令:satat命令:用于显示文件的详细信息,包括文件、设备、gid、各种时间等。命令格式:stat filename!(https://oscimg.oschina.net/oscnet/e65f9a778be16a16e51d1eae1bed034728c.png)touch的两个功能:1、新建文件,如
Wesley13 Wesley13
4年前
3springboot:springboot配置文件(配置文件占位符、Profile、配置文件的加载位置)
1.配置文件占位符RaandomValuePropertySourcr:配置文件可以使用随机数    ${random.value}    ${random.int} ${random.long}${random.int(10)}   ${random.int\1024,65535\}属性配置占位符