這篇文章主要介紹了php修改php文件內(nèi)容的方法,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)于2013年成立,先為曲周等服務(wù)建站,曲周等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為曲周企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
php修改文件內(nèi)容的方法:首先通過(guò)file_put_contents函數(shù)寫(xiě)入文件;然后使fwrite配合fopen進(jìn)行寫(xiě)入并修改的操作;最后通過(guò)file_exists等函數(shù)檢測(cè)文件屬性即可。
我們先來(lái)學(xué)習(xí)第一種寫(xiě)入文件的方式:
int file_put_contents ( string $文件路徑, string $寫(xiě)入數(shù)據(jù)])
功能:向指定的文件當(dāng)中寫(xiě)入一個(gè)字符串(會(huì)清空原有的內(nèi)容),如果文件不存在則創(chuàng)建文件。返回的是寫(xiě)入的字節(jié)長(zhǎng)度
int fwrite ( resource $文件資源變量, string $寫(xiě)入的字符串 [, int 長(zhǎng)度])
總結(jié):
1.不論有沒(méi)有新建都會(huì)打開(kāi)文件重新寫(xiě)入
2.原有的文件內(nèi)容會(huì)被覆蓋掉
3.文件不存在會(huì)創(chuàng)建
那我們來(lái)對(duì)比一下以下幾個(gè)模式的不同:
模式 | 說(shuō)明 |
---|---|
r | 只能讀不能使用fwrite寫(xiě) |
r+ | 可操作讀、寫(xiě) |
w | 只可以寫(xiě)功能 |
w+ | 即可讀又可以寫(xiě) |
同樣是下面的這段代碼,我們改為a模式。
打開(kāi)網(wǎng)頁(yè)執(zhí)行這段代碼,你會(huì)發(fā)現(xiàn):每刷新一次,文件中就會(huì)多一段
:讀大學(xué)迷茫了,創(chuàng)新互聯(lián)學(xué)PHP給你希望。
總結(jié):
模式 | 總結(jié) |
---|---|
x | 每次寫(xiě)入會(huì)干掉原有文件的內(nèi)容,文件不存在都會(huì)創(chuàng)建 |
a | 每次寫(xiě)入都會(huì)向文件的尾端追加內(nèi)容 |
這段代碼我們?cè)賹?shí)驗(yàn)一次,改為x模式:
我們會(huì)發(fā)現(xiàn):
1.文件存在的時(shí)候會(huì)報(bào)錯(cuò) 2.如果把$filename 改成其他的文件名,就可以了。但是,再次刷新的時(shí)候又報(bào)錯(cuò)了 3.x+ 是增強(qiáng)的x模式。讀取時(shí)也可以使用。
我們來(lái)學(xué)習(xí)一下這個(gè)函數(shù):
resource tmpfile ( )
功能:創(chuàng)建一個(gè)臨時(shí)文件,返回資源類(lèi)型。關(guān)閉文件即被刪除。
重命名文件
bool rename($舊名,$新名);
這個(gè)函數(shù)返回一個(gè)bool值,將舊的名字改為新的名字。
復(fù)制文件
復(fù)制文件,就相當(dāng)于是克隆技術(shù),將一個(gè)原來(lái)的東西再克隆成一個(gè)新的東西。兩個(gè)長(zhǎng)得一模一樣。
bool copy(源文件,目標(biāo)文件)
功能:將指定路徑的源文件,復(fù)制一份到目標(biāo)文件的位置。
注:
1·復(fù)制的文件名不能和源文件同名,否則無(wú)法復(fù)制;
2.復(fù)制文件名如果已經(jīng)存在的話,會(huì)把源文件的內(nèi)容copy一份替換復(fù)制文件的內(nèi)容。
刪除文件
刪除文件就是將指定路徑的一個(gè)文件刪除,不過(guò)這個(gè)刪除是直接刪除。使用的是windows電腦,你在回收站看不到這個(gè)文件。
你只會(huì)發(fā)現(xiàn),這個(gè)文件消失了。
bool unlink(指定路徑的文件)
bool file_exists ( $指定文件名或者文件路徑) 功能:文件是否存在。 bool is_readable ( $指定文件名或者文件路徑) 功能:文件是否可讀 bool is_writeable ( $指定文件名或者文件路徑) 功能:文件是否可寫(xiě) bool is_executable ( $指定文件名或者文件路徑) 功能:文件是否可執(zhí)行 bool is_file ( $指定文件名或者文件路徑) 功能:是否是文件 bool is_dir ( $指定文件名或者文件路徑) 功能:是否是目錄 void clearstatcache ( void ) 功能:清楚文件的狀態(tài)緩存
我們來(lái)講第一個(gè)例子,文件鎖。如果已經(jīng)安裝了,存在安裝鎖就提示已安裝,否則就繼續(xù)安裝。
我們假設(shè)安裝界面的網(wǎng)址是:install.php,安裝的鎖文件是install.lock。我們就可以檢測(cè)install.lock文件是否存在。
平臺(tái) | 分割符 |
---|---|
windows | \ |
類(lèi)unix | / |
我們會(huì)使用到一個(gè)常量:
DIRECTORY_SEPARATOR //代表反斜杠
由于FILE是PHP的預(yù)定義常量,所以沒(méi)辦法改變,如果需要讓FILE也自適應(yīng)操作系統(tǒng)。
那么就是不要用FILE,可以用自定義的常量,并且把FILE處理一下,如下:
文件指針操作函數(shù)
rewind ( resource handle) 功能:指針回到開(kāi)始處 fseek ( resource handle, int offset [, int from_where]) 功能:文件指針向后移動(dòng)指定字符
demo2.txt > aaaaa > bbbbb > 11111 > 22222 $fp = fopen('demo2.txt', 'r+'); //讀取10個(gè)字符, //讀取前十個(gè)字節(jié)(空格算一個(gè),換行算兩個(gè)字節(jié)) echo fread($fp,10); //指針設(shè)置回到開(kāi)始處 rewind($fp); // aaaaa bbb //再讀取10次看看輸出的是什么 echo '
'; echo fread($fp,10); // aaaaa bbb echo '
'; //文件指針向后移動(dòng)10個(gè)字符,(當(dāng)前指針在最開(kāi)始的位置) echo fseek($fp,10); // fseek的返回值為0 echo '
'; //再看看文件中輸出的是什么 echo fread($fp,10); // bb 11111 echo '
'; fclose($fp); ?>
其它操作文件的函數(shù)
其實(shí)還有一些其他操作文件的函數(shù),讀取文件
函數(shù)名 | 功能 |
---|---|
file | 把整個(gè)文件讀入一個(gè)數(shù)組中 |
fgets | 從文件指針中讀取一行,讀到最后返回false |
fgetc | 從文件指針中讀取一個(gè)字符,讀到最后返回false |
ftruncate | 將文件截?cái)嗟浇o定的長(zhǎng)度 |
fgetc
//以增加的r模式打開(kāi) $fp = fopen('demo2.txt','r+'); //你會(huì)發(fā)現(xiàn)每次只讀一個(gè)字符 echo fgetc($fp) .'
'; //只讀取一個(gè)字符 //我要全部讀取可以,讀取一次將結(jié)果賦值一次給$string while($string = fgetc($fp)){ echo $string; //讀取不到返回false }
fgets
//以增加的r模式打開(kāi) $fp = fopen('demo.txt','r+'); //你會(huì)發(fā)現(xiàn)每次讀取一次打開(kāi)一行 echo fgets($fp); echo fgets($fp); echo fgets($fp); echo fgets($fp); //讀取不到返回false
ftruncate返回值為1 int
ftruncate($file , len);截取的長(zhǎng)度大于文件內(nèi)容長(zhǎng)度,會(huì)用空字符填補(bǔ)
//打開(kāi)我們上面的demo.txt文件 $file = fopen("demo.txt", "a+"); //你可以數(shù)數(shù)20個(gè)字有多長(zhǎng),看看是不是達(dá)到效果了 echo ftruncate($file,20); fclose($file);
函數(shù) | 功能說(shuō)明 |
---|---|
filectime | 文件創(chuàng)建時(shí)間 |
filemtime | 文件修改時(shí)間 |
fileatime | 文件上次訪問(wèn)時(shí)間 |
文件鎖的用途:
若一個(gè)人在寫(xiě)入一個(gè)文件,另外一個(gè)人同時(shí)也打個(gè)了這個(gè)文件進(jìn)行寫(xiě)入文件。
這情況下,如果遇到一定的碰撞概率的話,不知道到底誰(shuí)的操作為準(zhǔn)。
因此,這個(gè)時(shí)候我們引入鎖機(jī)制。
若用戶A在寫(xiě)入或者讀取這個(gè)文件的時(shí)候,將文件加上共享所。我可以讀,其他人也可以讀。
但是,我如果這與的時(shí)候。我使用獨(dú)占鎖。這個(gè)文件歸我了,你們都別動(dòng),除非我將文件鎖進(jìn)行釋放。
注意:加上了文件鎖后要注意釋放。
php 文件鎖處機(jī)制
文件鎖機(jī)制一般在單一打開(kāi)文件的時(shí)候根本看不到效果。這一塊的學(xué)習(xí)有一點(diǎn)點(diǎn)抽象。
大家不要去思考怎么實(shí)現(xiàn)的呀?
為什么看不到效果呀?
答:因?yàn)殡娔X的操作太快了,基本上是毫秒級(jí)的。所以這個(gè)實(shí)驗(yàn)其實(shí)是看不到效果的。
這一章了解文件鎖的基本概念即可,熟悉文件鎖函數(shù)和鎖機(jī)制。
文件鎖的用途:
若一個(gè)人在寫(xiě)入一個(gè)文件,另外一個(gè)人同時(shí)也打個(gè)了這個(gè)文件進(jìn)行寫(xiě)入文件。
這情況下,如果遇到一定的碰撞概率的話,不知道到底誰(shuí)的操作為準(zhǔn)。
因此,這個(gè)時(shí)候我們引入鎖機(jī)制。
若用戶A在寫(xiě)入或者讀取這個(gè)文件的時(shí)候,將文件加上共享所。我可以讀,其他人也可以讀。
但是,我如果這與的時(shí)候。我使用獨(dú)占鎖。這個(gè)文件歸我了,你們都別動(dòng),除非我將文件鎖進(jìn)行釋放。
注意:不論加上了文件鎖后要注意釋放。
我們來(lái)看看這個(gè)函數(shù):
bool flock ( resource $handleFile , int $operation)
我們來(lái)看看鎖類(lèi)型:
鎖類(lèi)型 | 說(shuō)明 |
---|---|
LOCK_SH | 取得共享鎖定(讀取的程序) |
LOCK_EX | 取得獨(dú)占鎖定(寫(xiě)入的程序) |
LOCK_UN | 釋放鎖定(無(wú)論共享或獨(dú)占) |
我們接下來(lái)把demo2.txt加上一個(gè)獨(dú)占鎖,進(jìn)行寫(xiě)入操作。
$fp = fopen("demo2.txt", "r+"); // 進(jìn)行排它型鎖定 if (flock($fp, LOCK_EX)) { echo '1'; fwrite($fp, "文件這個(gè)時(shí)候被我獨(dú)占了喲\n"); // 釋放鎖定 flock($fp, LOCK_UN); } else { echo "鎖失敗,可能有人在操作,這個(gè)時(shí)候不能將文件上鎖"; } fclose($fp);
說(shuō)明:
1.上例中我為了寫(xiě)入文件,把文件加上了獨(dú)占鎖。
2.如果我操作完成,寫(xiě)入完成后,解除掉了獨(dú)占鎖。
3.如果是在讀取文件的時(shí)候,大家可加按照同樣的處理思路加上共享鎖。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享php修改php文件內(nèi)容的方法內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問(wèn)題就找創(chuàng)新互聯(lián),詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!