PHP文件操做及實例:留言板

1、文件操做函數
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.文件內容操做:php

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'):將文件存爲數組,每一行是一個元素

注:以上涉及讀取文件內容的函數無需先打開文件html

2、文件的打開與關閉
1.$open=fopen('./xxx.php','r');
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
注:附加Mode:b操做二進制文件時加上,t文本文件
圖片描述數組

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

3、移動文件的指針
1.ftell($open);返回指針當前位置,默認爲開始
2.fseek($open,-4,SEEK_END);將指針移動至某位置,如從文件尾前移4個字節,注意結尾可能有換行符。能夠配合fopen的a追加模式更方便的操做post

$whence值能夠是:
•SEEK_SET - 設定位置等於 offset 字節。
•SEEK_CUR - 設定位置爲當前位置加上 offset。
•SEEK_END - 設定位置爲文件尾加上 offset。

3.rewind($open);將指針放到開頭
4、文件的鎖定機制
1.flock($open,LOCK_SH):讀取/寫入文件時都須要鎖定(LOCK_SH/LOCK_EX),以防止多人同時操做,解鎖時方法相同(LOCK_UN)
注:$handle必須指向一個打開的文件資源
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )spa

operation 能夠是如下值之一: 
◦ LOCK_SH取得共享鎖定(讀取的程序)。  
◦ LOCK_EX 取得獨佔鎖定(寫入的程序。  
◦ LOCK_UN 釋放鎖定(不管共享或獨佔)。

5、實例:留言板指針

<?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>
相關文章
相關標籤/搜索