之所以提到這個功能,是因為要介紹一下php7相對於php5的效能提公升。在本次功能中需要呼叫匿名函式,而匿名函式的乙個主要問題就是使用$this來表示任意物件,在php5中使用bindto()方法來解決,在php7中使用call()方法來解決,方法的轉變同時顯示著php7效能的提公升。
下面直接看下功能吧!
思想:首先我們需要乙個php檔案處理類來提取檔案內容,為了可以對大資料檔案的提取,我們採用生成器yield來輸出每行資料,這時檔案處理類決定了是splfileobject類,這個類物件可以通過fgets()方法來獲取文字檔案的一行資料。對提取的資料使用正規表示式來獲取ip位址,最後輸出ip位址和重複的次數就可以了。
關鍵:
ip位址正規表示式:』/((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]).)(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])/』,只需要將0-255分開處理即可
**:
access類來對文字檔案進行處理提取資料和匹配正規表示式
<?php
/* * 接收日誌檔案讀取其中的ip位址
* */
;use
exception
;//php自帶的異常類,phpunit中也有異常處理類
usesplfileobject
;class
access
$this
->
log=
newsplfileobject
($filename
,'r');
//對檔案進行讀模式,產生乙個檔案處理物件
}//生成器逐行迭代該檔案
public
function
fileiteratorbyline()
return
$count;}
//匹配ip位址
public
function
getip
($line
)(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])/'
,$line
,$match);
119. 119 101
return
$match[0
]??'';}}
測試**:
<?php
//測試access類
define
('log_file'
,'../log/*access*.log');
require_once
__dir__
.'/../autoload/loader.php'
;\autoload\loader::
init
(__dir__
.'/../../');
//定義匿名函式處理ip位址,匿名函式繫結任何變數,bindto和call方法,call方法的效率提高20%-50%
$freq
=function
($line)}
;/*echo'';
print_r
($freq);
echo'';
*///閉包物件,closure object
最後提一下php7效能的提公升原因:
借鑑
php 讀取文字檔案內容
php讀取檔案內容的三種方法 第一種讀取方式 如下 header content type text html charset utf 8 告訴php預處理器將內容已utf8的格式傳遞給瀏覽器 檔案路徑 file path text.txt 判斷是否有這個檔案 if file exists file...
php 逐行讀取文字檔案
在讀取文字時,我們要注意乙個事情,那就是換行符,應為我們在寫文件時會手動換行,這個換行符需不需要儲存就要看自己的需求了。這裡封裝了兩個方法,乙個保留換行,乙個不保留。path為檔案路徑 檔名 1.不保留換行 1 function read path 11 fclose file 12 user ar...
PHP中對文字檔案操作很好的類
class ctbclass 新增資料記錄到檔案末端 function add write new 配合readfile 的返回一起使用,把一行資料轉換為一維陣列 function make array line 把為一維陣列轉換一行資料 function join array line 返回資料檔...