折雨的天空

新浪微薄腾讯微薄

最新碎语:最近霉到了住。哎。。。

您的位置:折雨的天空 >php开发> PHP分析nginx日志,主要是读大日志文件

PHP分析nginx日志,主要是读大日志文件

PHP8的命令行执行的,主要可以看看读取文件,700M的文件,没有超内存。

date_default_timezone_set('Asia/Shanghai'); //定义时区
$db=new mysqli('localhost','root','123456','test');
ini_set('memory_limit',4096*1024*1024);
$tmp='./nginx.log';
foreach (getLines($tmp) as $n => $line) {
    $str='([^-s]+) - - [([^]]+)] ".* (.*) HTTP/.*" .* ".*" "([^"]+)" ".*"';
    preg_match('~'.$str.'~Uis',$line,$res);
    _log('Start '.($n+1).' rows!');
    $ip=isset($res[1])?$res[1]:'';
    $time=isset($res[2])?date('Y-m-d H:i:s',strtotime($res[2])):date('Y-m-d H:i:s');
    $exploer=isset($res[4])?$res[4]:'';
    $requestUri=isset($res[3])?$res[3]:'';
    if ($exploer){
        //$phoneInfo=explode(' ',$exploer);
        $regStr='(.*) ((.*)) (.*) ((.*)) (.*) NetType/(.*) Language/.*';
        preg_match('~'.$regStr.'~Uis',$exploer,$nres);
        $exploerVersion=isset($nres[1])?$nres[1]:'';
        $phoneVersion=isset($nres[2])?$nres[2]:'';
        //手机操作系统类型,1 Android 2 Iphone 3 其他
        $isIphone=3;
        if(stripos($phoneVersion,'iPhone')){
            $isIphone=2;
        }
        if(stripos($phoneVersion,'Android')){
            $isIphone=1;
        }
        $webVersion=isset($nres[3])?$nres[3]:'';
        $htmlVersion=isset($nres[4])?$nres[4]:'';
        $wechatVersion=isset($nres[5])?$nres[5]:'';
        $netType=isset($nres[6])?$nres[6]:'';
    }
    //写入数据库
    $uuid=uniqid('L_',true);
    $sql="insert into logs_nginx (`uuid`,`ip`,`visit_time`,`os`,`exploer_version`,`web_version`,`html_version`,`wechat`,`net_type`,`request_uri`,`logs`,`server`,`os_type`) values ('$uuid','$ip','$time','$phoneVersion','$exploerVersion','$webVersion','$htmlVersion','$wechatVersion','$netType','$requestUri','$line','127.0.0.1','$isIphone')";
    $db->query($sql);
    if ($db->errno!='0'){
        _log('数据库错误:'.$db->error);
    }
    _log('End '.($n+1).' rows!');
}
$db->close();
function _log($log_line){
    $time_array = explode(" ", microtime());
    $time_array[0] = sprintf('%.6f', $time_array[0]);
    $time = date('Y/m/d H:i:s.', $time_array[1]) . substr($time_array[0], 2) ;
    echo "[$time] $log_line" . PHP_EOL;
}

function getLines($file) {
    $f = fopen($file, 'r');
    try {
        while ($line = fgets($f)) {
            yield $line;
        }
    } finally {
        fclose($f);
    }
}

用php命令行执行。速度还行。

------------正 文 已 结 束, 感 谢 您 的 阅 读 (折雨的天空)--------------------

转载请注明本文标题和链接:《PHP分析nginx日志,主要是读大日志文件

奖励一下

取消

分享不易,烦请有多多打赏,如您也困难,点击右边关闭即可!

扫码支持
扫码打赏,5元,10元,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

-秒后自动关闭,如已打赏,或者不愿打赏,请点击右上角关闭图标。

发表评论

路人甲 表情
看不清楚?点图切换