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);
}
}