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

微麦PHP 2019-06-21

一、文件操作函数
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>

相关推荐