很多站长朋友们都不太清楚php读取大日志文件,今天小编就来给大家整理php读取大日志文件,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 如何用php程序监听一个不断增长的日志文件 2、 如何有效用PHP分析超大日志(2G) 3、 php 一个10g的日志文件如何取出出现次数最多得ip 4、 PHP读取大日志文件,怎么玩 5、 怎么用php读取日志文件?并把需要的字段取出来保存到数据库? 6、 php处理大文件文件 如何用php程序监听一个不断增长的日志文件一般我们访问一个页面都是输入有url
这时,浏览器发送了一个http请求,请求的内容当然是一个页面
你所说的监听浏览器的请求,与其说是后台脚本在监听,倒不如说是服务器在监听(脚本在服务器上运行),是服务器监听到端口有请求,才去执行相应的脚本程序
一般情况下,我们有2种做法,让后台脚本运行。
1是直接访问该脚本文件(或者说是动态页)
2是ajax请求(实际上也相当于把这个动态页跑了一遍,只不过,不让用户看到)
浏览器访问一个地址时,如果该地址映射的就是一个脚本页的话,则该脚本页就已经开始执行了(即所谓响应浏览器请求),当然前提是,你的服务器配置了可以让php脚本运行的环境,能够让php脚本正常运行
至于监听到请求之后如何处理请求,完全是看你的脚本页是怎么写的,你的php文件写了什么功能,他就执行什么功能
如何有效用PHP分析超大日志(2G)这个办法可以提高一些效率: 先把结果存在变量里, 全部读取后再存盘.
即把这段代码:
if (fwrite($handle_result, $buffer) === FALSE) {
echo "1 record failed to write into log.
";
}
else
{
echo "1 record susseccful to write into log.
";
}
替换成:
$result .= $buffer . "\r\n";
$i++;
然后在while循环之前加上:
/*初始化变量*/
$result = "";
$i = 0;
在循环结束后加上:
if (fwrite($handle_result, $result) === FALSE) {
echo "Failed to write into log.
";
}
else
{
echo "$i records have been written into log susseccfully.
";
}
php 一个10g的日志文件如何取出出现次数最多得ip//php直接用file_get_contents去读取10g的文件内存可以会爆,建议使用fgets函数一行一行取
$file = fopen("1.log","r");
while(!feof($file))
{
echo fgets($file). "<br /><br /><br />";
}
fclose($file);
PHP读取大日志文件,怎么玩应该一行一行进行处理,不能一次加载到内存。
1 $line = '';
2
3 $f = fopen('data.txt', 'r');
4 $cursor = -1;
5
6 fseek($f, $cursor, SEEK_END);
7 $char = fgetc($f);
8
9 /**
10 * Trim trailing newline chars of the file
11 */
12 while ($char === "\n" || $char === "\r") {
13 fseek($f, $cursor--, SEEK_END);
14 $char = fgetc($f);
15 }
16
17 /**
18 * Read until the start of file or first newline char
19 */
20 while ($char !== false $char !== "\n" $char !== "\r") {
21 /**
22 * Prepend the new char
23 */
24 $line = $char . $line;
25 fseek($f, $cursor--, SEEK_END);
26 $char = fgetc($f);
27 }
28
29 echo $line;
怎么用php读取日志文件?并把需要的字段取出来保存到数据库?这个哪有具体的写法,
1、打开文件(file_get_contents,或其他)
2、正则表达式匹配需要的内容(preg_match,或其他)
3、整理数据保存数据库
php处理大文件文件我前几天有一个面试,面试题就是有这样一道题。先把自己的思路说一下,因为信息量非常的大,所以我采用了分表,分成24张表,每个小时一张,虽然凌晨时刻的表可能很少数据,但这样sum字段的问题就容易解决了,我理解的sum字段是一个小时同一个用户在相同的环境的登陆次数。这样理解不知对否,请网友自行甄辨。然后我通过PHP中的fgets函数一行一行的数据取出,入表。实验了几万条数据是没有问题的,但是上亿条数据可能够呛。这一点也请网友注意,我也是新手。只是看到这里没有答案,给大家一个参考。废话不多,看流程:
日志文件(access.log)格式:
200 /alipeng.gif?zoneid=2bannerid=44clentid=6materialid=64redirect=http%3a%2f%2f;time=1384444800.832ip=127.0.0.1user_agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.48 Safari/537.36utrace=a6dbdd2f6a37b946165b7ae98dcd4f79
502 /alipeng.gif?zoneid=2bannerid=44clentid=6materialid=64redirect=http%3a%2f%2f;time=1384444800.904ip=127.0.0.1user_agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.48 Safari/537.36utrace=a6dbdd2f6a37b946165b7ae98dcd4f79
配置文件cfg.php:
define(HOST,'localhost');//主机名
define(USER,'root');//数据库账号
define(PASS,'111111');//数据库密码
define(DBNAME,'test');//所用的数据库
define(CHARSET,'utf8');//使用的字符集
具体代码test.php:
<?php
header("content-type:text/html;charset=utf-8");
require './cfg.php';
$link = mysql_connect(HOST,USER,PASS) or die('连接数据库失败');
//程序中自动建库和建表,这样一定程度上拖慢了程序的速度
//创建数据库
$crdb="create database if not exists ".DBNAME;
if(!mysql_query($crdb)){
die('创建数据库失败');
}
//链接数据库
mysql_select_db(DBNAME) or die('选择数据库失败');
mysql_set_charset(CHARSET);
//因为数据量很大我将数据按小时分表,分成24个表,每小时一个表,这样num字段的值也好做统计
//数据循环建表
for($i=0;$i<24;$i++){
if($i<10){
$tbhz='0'.$i;//如果前10张表,表后缀应该是00-09
}else{
$tbhz=$i;
}
$ctbsql="create table if not exists logininfo_{$tbhz}(
id int not null auto_increment primary key,
zoneid int not null default 0,
bannerid int not null default 0,
clentid int not null default 0,
materialid int not null default 0,
redirect char(200) not null default '',
time char(16) not null default '',
user_agent char(200) not null default '',
utrace char(32) not null default '',
sum int not null default 0
)TYPE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci";
mysql_query($ctbsql);
}
//打开文件
$file=fopen("./access.log",'r') or die("打开文件失败");
//对文件内容进行循环,直到文件末尾才停止
while (!feof($file)){
//每次读取一行
$line = fgets($file,1024);
//状态是200的进行写入数据库操作
if(preg_match('/^200/',$line)){
$pinfo=parse_url($line);//url信息
$ext=$pinfo['query'];//取得传递的各个参数
$parray=explode('',$ext);//根据分解为数组
//因为分解为数组后并不是要的值,所以要对值进行一次截取,将等号及等号左边的都去掉
foreach($parray as $val){
$narray[]=ltrim(strstr($val,'='),'=');
}
$narray[8]=rtrim($narray[8],'_');
//截取时间的秒数
$getmun=substr($parray[5],5,10);
$time=date('Y-m-d H',$getmun);//将秒数转化为时间类型。
//得到表后缀
$tbhz=date('H',$getmun);
$sql="insert into logininfo_{$tbhz} values(null,'{$narray[0]}','{$narray[1]}','{$narray[2]}','{$narray[3]}','{$narray[4]}','{$time}','{$narray[7]}','{$narray[8]}',0)";
//echo $sql;
$res=mysql_query($sql);//执行插入
if(!$res || !mysql_affected_rows()>0){
die('写入数据库失败');
}
unset($narray);//循环一次将narray销毁,为下一次循环做准备
//var_dump(parse_url($line)['query']);
}
}
fclose($file);//关闭
//因为sum字段还是0,下面代码段需要处理sum字段的值
//24张表循环处理
for($i=0;$i<24;$i++){
if($i<10){
$tbhz='0'.$i;//如果前10张表,表后缀应该是00-09
}else{
$tbhz=$i;
}
//该sql语句是把同一个小时内,并且符合条件相等的登陆的总次数和需要的登陆信息查出,为下面修改sum做准备
$sql="SELECT COUNT('zoneid') AS sum,zoneid,bannerid,clentid,materialid,redirect,user_agent,utrace FROM logininfo_{$tbhz} GROUP BY zoneid,bannerid,clentid,materialid,redirect,user_agent,utrace";
//发送查询sql
$res=mysql_query($sql);
if($res mysql_num_rows($res)>0){
while($row=mysql_fetch_assoc($res)){
//修改sum字段,即同一小时内的登陆次数
$upsql="update logininfo_{$tbhz} set sum='{$row['sum']}' where zoneid='{$row['zoneid']}' and bannerid='{$row['bannerid']}' and clentid='{$row['clentid']}' and materialid='{$row['materialid']}' and redirect='{$row['redirect']}' and user_agent='{$row['user_agent']}' and utrace='{$row['utrace']}'";
//发送修改sql,执行修改sum
$upres=mysql_query($upsql);
if(!$upres){
die('修改登陆sum失败');
}
}
}
}
echo '数据成功入表';
使用说明:
将配置文件cfg.php中的连接数据库账号、密码修改为自己本机的(默认新增的库名是test)
直接运行test1.php
关于php读取大日志文件的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于php读取大日志文件 php日志输出的详细内容...