在php中,對於文件的讀取時,最快捷的方式莫過於使用一些諸如file、file_get_contents之類的函數,簡簡單單的幾行代碼就能很漂亮的完成我們所需要的功能。但當所操作的文件是一個比較大的文件時,這些函數可能就顯的力不從心, 下面將從一個需求入手來說明對於讀取大文件時,常用的操作方法。
需求
有一個800M的日誌文件,大約有500多萬行, 用php返回最後幾行的內容。
實現方法
1. 直接採用file函數來操作
註:由於 file函數是一次性將所有內容讀入內存,而php為了防止一些寫的比較糟糕的程序佔用太多的內存而導致系統內存不足,使伺服器出現宕機,所以默認情況下限制只能最大使用內存16M,這是通過php.ini里的memory_limit = 16M來進行設置,這個值如果設置-1,則內存使用量不受限制.
下面是一段用file來取出這具文件最後一行的代碼.
整個代碼執行完成耗時 116.9613 (s).
$fp = fopen($file, "r");
$num = 10;
$chunk = 4096;
$fs = sprintf("%u", filesize($file));
$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);
for ($len = 0; $len < $max; $len += $chunk) {
$seekSize = ($max - $len > $chunk) ? $chunk : $max - $len;
fseek($fp, ($len + $seekSize) * -1, SEEK_END);
$readData = fread($fp, $seekSize) . $readData;
if (substr_count($readData, "n") >= $num + 1) {
preg_match("!(.*?n){".($num)."}$!", $readData, $match);
$data = $match[0];
break;
}
}
fclose($fp);
echo $data;
我機器是2個G的內存,當按下F5運行時,系統直接變灰,差不多20分鍾後才恢復過來,可見將這么大的文件全部直接讀入內存,後果是多少嚴重,所以不在萬不得以,memory_limit這東西不能調得太高,否則只有打電話給機房,讓reset機器了.
2.直接調用linux的tail命令來顯示最後幾行
在linux命令行下,可以直接使用tail -n 10 access.log很輕易的顯示日誌文件最後幾行,可以直接用php來調用tail命令,執行php代碼如下.
整個代碼執行完成耗時 0.0034 (s)
file = 'access.log';
$file = escapeshellarg($file); // 對命令行參數進行安全轉義
$line = `tail -n 1 $file`;
echo $line;
3. 直接使用php的fseek來進行文件操作
這種方式是最為普遍的方式,它不需要將文件的內容全部讀入內容,而是直接通過指針來操作,所以效率是相當高效的.在使用fseek來對文件進行操作時,也有多種不同的方法,效率可能也是略有差別的,下面是常用的兩種方法.
方法一
首先通過fseek找到文件的最後一位EOF,然後找最後一行的起始位置,取這一行的數據,再找次一行的起始位置,再取這一行的位置,依次類推,直到找到了$num行。
實現代碼如下
整個代碼執行完成耗時 0.0095 (s)
function tail($fp,$n,$base=5)
{
assert($n>0);
$pos = $n+1;
$lines = array();
while(count($lines)< =$n){
try{
fseek($fp,-$pos,SEEK_END);
} catch (Exception $e){
fseek(0);
break;
}
$pos *= $base;
while(!feof($fp)){
array_unshift($lines,fgets($fp));
}
}
return array_slice($lines,0,$n);
}
var_mp(tail(fopen("access.log","r+"),10));
方法二
還是採用fseek的方式從文件最後開始讀,但這時不是一位一位的讀,而是一塊一塊的讀,每讀一塊數據時,就將讀取後的數據放在一個buf里,然後通過換行符(n)的個數來判斷是否已經讀完最後$num行數據.
實現代碼如下
整個代碼執行完成耗時 0.0009(s).
$fp = fopen($file, "r");
$line = 10;
$pos = -2;
$t = " ";
$data = "";
while ($line > 0) {
while ($t != "n") {
fseek($fp, $pos, SEEK_END);
$t = fgetc($fp);
$pos --;
}
$t = " ";
$data .= fgets($fp);
$line --;
}
fclose ($fp);
echo $data
方法三
整個代碼執行完成耗時 0.0003(s)
ini_set('memory_limit','-1');
$file = 'access.log';
$data = file($file);
$line = $data[count($data)-1];
echo $line;
php壓縮HTML函數輕松實現壓縮html/js/Css及注意事項 phpexcel導出excel的顏色和網頁中的顏色顯示不一致
2. PHP編程基礎與實例教程的內容簡介
本書共分為13章,涵蓋了PHP開發環境的搭建、PHP語法、FORM表單、資料庫設計、PHP與資料庫連接、會話控制、界面設計等內容。
本書由孔祥盛主編,內容豐富、講解深入,適用於初、中級PHP用戶,可以用做各類院校相關專業的教材,同時也是面向廣大PHP愛好者的一本PHP實用參考書。
3. 推薦幾本學習PHP的書
《PHP與MySQL程序設計》
《 PHP web 2.0開發實戰》
《 PHP高級程序設計:模式、框架與測試 》
《PHP實戰》(PHP in Action)
《深入PHP面向對象、模式與實踐 (第2版) 》
《PHP和MySQL Web開發原書第4版 》
《 PHP經典實例(第二版)》
《PHP技術內幕》
《 PHP與MYSQL基礎教程 》
4. php編程急求答案謝謝
config.php文件內容
<?php
return[
//伺服器地址
'hostname'=>'localhost',
//資料庫名
'database'=>'',
//用戶名
'username'=>'',
//密碼
'password'=>'',
//資料庫表前綴
'prefix'=>'',
];
5. php書那本好,推薦一本
《PHP編程基礎與實例教程》這本書吧,剛買了一本,書看了一個月,看到一半了,涉及的內容較為廣泛,講的深入透徹,能學以致用。你不妨也試試。
6. PHP編程問題,請達人解惑
我知道你的問題出在那了
是SQL語句有問題
$sql = "select * from lesson,teacher where lesson.{$teacherId}=teacher.{$teacherId}";
比如我輸入的是一個數字
SELECT *
FROM lesson, teacher
WHERE lesson.4 = teacher.4
那麼你的數據表有欄位叫4的嗎這里的lesson.點後面應該是欄位名吧而不是值
改成欄位名試試
7. 求經典PHP基礎教程
《PHP與MySQL程序設計》《 PHP web 2.0開發實戰》《 PHP高級程序設計:模式、框架與測試 》《PHP實戰》(PHP in Action) 《深入PHP面向對象、模式與實踐 (第2版) 》《PHP和MySQL Web開發原書第4版 》《 PHP經典實例(第二版)》《PHP技術內幕》《 PHP與MYSQL基礎教程 》
8. 求推薦初學PHP的教程
進來在網上發現不少朋友在詢問有關PHP學習方面的問題,有人擔心自己學歷低不適合學習,有人擔心自己數學基礎差不適合學習,也有人擔心自己年齡偏大不適合學習,諸如此類。接下來站長就把自己學習PHP的過程分享一下,希望對大家有所幫助。
我是大學畢業1年半左右開始學習PHP的,當時的年齡是22歲,23歲不到。我的主要學習方式就是看書–>看視頻教程–>照著視頻寫代碼–>找工作–>工作中學習–>工作之餘學習。
一、年齡大怎麼辦
首先來說一下學習年齡,我畢業的時候是23歲不到,學習的時候實際年齡也沒滿25歲。以一般人的觀點來說,這個年齡學習編程已經不具備年齡優勢,但是凡事沒有絕對,因人而異,關鍵在於你自己是否真的想學,有那個毅力,當然也要一點天賦。站長在大學里學過C語言,應該說還有點底子,而恰恰PHP又是用C語言寫的,語法方面非常相似,所以入門的時候還不算費勁。也就是在學習PHP的時候我才感覺到大學里用心學習的意義,來日方長,當時用不到,不代表以後就用不到,在此也對那些認為大學里學習無用的朋友說一聲:多學一點沒壞處。
二、書怎麼看
如果你已經下定了決心要學習了,接下來就應該選擇一本好教程。【這只是站長的建議,如果你覺得直接看視頻更適合你可以選擇跳過。】站長並不推薦看國內的計算機教材,內容平平不說,而且很多是過時 的,倒不是貶低國內的計算機水平,只是濫竽充數的實在太多,想找一本好書太難。我看的教材是《PHP與Mysql web開發》原書第四版【之前還看過一本不入眼的教材就不推薦了】,俗稱「PHP聖經」,這兩個名字你任意網路一個都可以搜到,建議到網上購買,書店裡的太貴。如果你之前沒有學習過html和javascript,我建議大家先去找這方面的教材看,html和基礎javascript都很簡單,不需要害怕。
我個人的經驗,光看書本你不會學到太多,因為編程是要在實際寫代碼的過程中才會深刻體會到理論。但是書上的內容可以給你先在腦海中對php是怎麼一回事形成一個大概的印象,有一些內容你可能一時無法理解消化,我不建議大家在一個地方停留太久,不行就跳過去,繼續往後看,但是要把不懂的地方做一下記號,當我們進行到下一步的時候逐一解決。
三、選擇好的視頻教程
由於個人的接受方式不一樣,所以不存在符合所有人的視頻教程。站長先入為主的看了《中學大學PHP教程》,這是台灣中原大學一個老師出的,5集。用來入門是不錯的選擇,當然也可以去php100中文網看教程,php100的教程比較多,也講得比較淺,入門也是不錯的。建議大家下載看,不要圖快,要有耐性,站長當初1天看1集,5天看完的。下載看最大的好處就是,一時走神了沒注意可以退回去繼續看,o(∩_∩)o 哈哈!在看視頻教程的時候,留心注意自己看書時遇到的問題,因為視頻教程往往都配有代碼講解,所以應該能夠為你解決一部分在看書時遺留下來的問題。
四、動手寫代碼–依葫蘆畫瓢
看完書和視頻後,就可以嘗試自己動手寫代碼了,站長是照著視頻寫的,因為第一次寫很多地方不記得,經常把視頻退回去看他怎麼寫的【囧!】。這個過程並不舒服,但是咬牙堅持下來,你會發現,依葫蘆畫瓢就會漸漸催生你自己的代碼。因為依葫蘆畫瓢只是讓你理解php網站開發的基本原理,一個功能的具體業務邏輯怎麼實現,代碼的執行流程是怎麼樣的,代碼以什麼樣的方式構成,並不是要你生搬硬套,這一點要切記,否則你離開視頻就無法動手的話,那就麻煩了!
五、找工作
當你看了一段時間的視頻教程,寫過一段時間的代碼後就可以嘗試去找工作了,記住程序員最主要的是編程思想,也就是解決問題的方法,如果你還沒有領悟這一點,就不要操之過急。你最好已經寫過一些拿得出手的作品,掌握smarty或者任何一種開源框架,框架入門推薦thinkphp。剛出來找PHP工作,期望值低一些,如果是才畢業的沒有項目經驗,可以找找招實習生的公司或者一些對技術要求不高的小公司,總之先讓自己工作,進行實戰,在工作中你會遇到很多問題,這都是學習的機會。站長當初寫了一個留言板就去找程序員的工作了,而且運氣不錯,還真讓我找到了,呵呵,很多人都覺得不可思議呢!天啊?寫一個留言板就去工作了!現在想想,我也夠猛的。
六、最後談一下PHP對數學基礎的要求
首先要明確一點,任何編程語言,數學基礎好,在學習和使用的過程中都會事半功倍!而在php中,主要是做web開發,並不十分要求高深的演算法,所以對數學的要求相對C/C++這類語言來說,是要低得多的。關鍵在開發的過程中思路要清晰,代碼要嚴謹,所以邏輯思維很重要。而當你深入學習到一定程度,也是需要一定的數學基礎來支撐的。畢竟數學基礎好說明你的邏輯思維不差,而一些數據結構、特定功能的實現也是需要數學的。
總的來說,如果數學基礎差,在剛開始學習的時候是不需要太擔心的,但是如果要深入提高,就有必要自己充充電了。
以上就是個人 2年多來的一點經驗,關鍵還是多看、多寫、多找。看自己的代碼,進行改進優化;看別人的代碼,取長補短;寫自己的代碼,增強語言熟練度和編程經驗;遇到不懂的問題,多利用搜索引擎。
只要有恆心、堅持下來,相信大家都會很快度過那段菜鳥的艱苦歲月,變身老鳥向高手達人進發!
這里,站長與諸君共勉,共同在php的世界裡闖出自己的新天地!
PS:轉載請註明來自第一php網
9. 急!PHP編程
1、<script></script>
2、Notice: Undefined offset: 2
3、aaaaaa
4、501
5、52
6、12
上面的4-6題由於echo輸出沒有換行和空格,所以這些結果也是沒有換行和空格的,比如第6題的12分別代表輸出結果是1和2