概述
檔案是在web應用中經常會碰到的乙個部分,本章主要包括如何在php中開啟、關閉和操縱檔案,以及在開啟檔案後能夠對檔案做哪些處理等內容。
建立或開啟乙個本地檔案
可以用fopen()函式開啟/建立乙個本地檔案
<?phpfopen函式的第二個引數指定了開啟該流的訪問型別:$fh = fopen('file.txt','rb') or die("can't open file.txt: $php_errormsg");
?>
模式可讀?
可寫?檔案指標
截斷?建立?說明r
是否開始否
否唯讀開啟r+是
是開始否否
讀寫方式開啟w否
是開始是是
寫入方式開啟w+是
是開始是是
讀寫方式開啟a否
是結尾否是
寫入方式開啟,追加a+是
是結尾否是
讀寫方式開啟,追加x否
是開始否是
寫入方式開啟,如果檔案存在返回false,並產生乙個警告資訊x+是
是開始否是
建立並以讀寫方式開啟,同上存在返回false,並產生乙個警告資訊
檔案操作需要考慮其作業系統,在不同的作業系統下的某些檔案操作是不一樣的,例如:在unix系統中新行用\n,windows中是\r\n,而macintosh中則是\r。
除上面這些外,還有b表示以二進位制方式開啟檔案(預設是ascii形式),以二進位制形式開啟檔案可以在不同作業系統中具有很好的移植性,故官方手冊中強烈建議使用二進位制模式開啟檔案。
另外windows下還提供了乙個t用來透明轉換\n為\r\n。官方有一次強烈建議為移植性考慮,重寫那些依賴於t模式的**,改為正確的結束符並改成b模式
開啟遠端檔案
開啟遠端檔案也可以用fopen()函式,操作方法和本地檔案差不多,但有需要注意的一點是操縱遠端檔案需要php.ini中的allow_url_fopen設定為on。下面分別列舉了開啟ftp和http開啟乙個遠端txt檔案:
<?php讀取整個檔案內容到字串$fh = fopen('','r');
$fh = fopen('','r');
?>
使用file_get_contents()方法可以一次將一整個檔案的內容載入到乙個變數中去。但如果是要將整個檔案內容輸出可以選擇fpassthru()或者readfile()函式。(對於檔案的顯示等也適用)
按行讀取檔案
可以使用fgets()函式按行讀取檔案
$lines = 0;按指定位元組數讀取檔案if ($fh = fopen('orders.txt','r'))
} fclose($fh);
}print $lines;
可以使用fread()函式按指定位元組數讀取檔案
$handle = fopen ("", "rb");例子中每次按1m位元組大小讀取檔案遠端檔案$contents = "";
while (!feof($handle))
fclose($handle);
fread()從檔案指標 handle 讀取最多 length 個位元組。該函式在讀取完最多 length 個位元組數,或到達 eof 的時候,或(對於網路流)當乙個包可用時,或(在開啟使用者空間流之後)已讀取了 8192 個位元組時就會停止讀取檔案
隨機化處理檔案中的所有行
$lines = file('quotes-of-the-day.txt');讀取配置檔案$lines = shuffle($lines);
可以用parse_ini_file()函式來讀取類似php.ini格式的檔案,例如
<?phpexample.ini配置檔案內容如下:$config = parse_ini_file('/etc/example.ini');
?>
; physical features返回的陣列如下eyes=brown
hair=brown
glasses=yes
; other features
name=susannah
likes=monkeys,ice cream,reading
<?php如果給parse_ini_file()增加個引數,將得到不同的結果陣列array
( [eyes] => brown
[hair] => brown
[glasses] => 1
[name] => susannah
[likes] => monkeys,ice cream,reading
)?>
<?php得到的$conf如下:$config = parse_ini_file('/etc/example.ini',1);
?>
array不通過臨時檔案來修改檔案( [physical] => array
([eyes] => brown
[hair] => brown
[glasses] => 1
)[other] => array
([name] => susannah
[likes] => monkeys,ice cream,reading
))
通過file_get_contents()來讀取檔案內容,修改後,通過file_put_contents()函式回寫到檔案中去
$contents = file_get_contents('pickles.txt');同時寫入到多個檔案控制代碼$contents = strtoupper($contents);
file_put_contents('pickles.txt', $contents);
function pc_multi_fwrite($fhs,$s,$length=null)呼叫shell命令} else }}}
$fhs['file'] = fopen('log.txt','w') or die($php_errormsg);
$fhs['screen'] = fopen('php://stdout','w') or die($php_errormsg);
pc_multi_fwrite($fhs,'the space shuttle has landed.');
如果想通過php呼叫shell命令並獲取輸出可以通過popen()函式實現,**如下:
$ph = popen('/sbin/route','r') or die($php_errormsg);鎖定檔案while (! feof($ph))
pclose($ph) or die($php_errormsg);
通過flock()對檔案執行勸告式鎖定,可選擇排他鎖或共享鎖,排他鎖意味著每次只能由乙個程序控制。共享鎖意味著檔案每次可能由多個程序控制。根據其特性可知,在寫入檔案之前應使用排他鎖,在讀取檔案前應使用共享鎖。
讀寫壓縮檔案
//讀取本地的gzip檔案$fh = fopen('compress.zlib:','r') or die("can't open: $php_errormsg");
while ($line = fgets($fh))
fclose($fh) or die("can't close: $php_errormsg");
//讀取遠端的bzip2壓縮檔案
$fp = fopen('something-compressed.bz2','r');
while (! feof($fp))
fclose($fp);
《PHP Cookbook》學習筆記(三)
七 類和物件 1 如果用echo或print語句輸出乙個物件,php就會呼叫這個物件的 tostring 方法,如下 輸出如下 linglongwunv linglongwunv gmail.com 2 php5拷貝的是物件的引用而不是值。當把乙個現存的物件指定給乙個新變數時,新變數中儲存的只是這個...
《PHP Cookbook》學習筆記(四)
1 在與bindcolumn 組合使用的時候,pdo fetch bound取出模式可以讓你設定變數,這些變數的值會在每次呼叫fetch 時自動更新,如下所示 每當呼叫fetch 時,symbol和 planet都會被賦予新值。注意,在bindcolumn 中既可以使用列名也可以使用列數。列數從1開...
mysql運維 讀書筆記 Mysql 讀書筆記
mysql儲存時間有兩種型別 datetime和timestamp。分別說一下兩者的區別。datetime,以8位元組儲存時間,理論上可以從0000年儲存到9999年。並且沒有時區的概念,它儲存的就是乙個時間點的概念。timestamp和datetime最主要的不同就是,它是以4個位元組儲存,由19...