问题起源:由于系统被外挂攻击,所以要对外部访问的日志进行分析,找出攻击者的攻击方式。系统使用了lvs,这样就有了多个访问日志文件,需要将所有的日志进行合并。这个合并的要求很简单,由于每个文件的纪录都是按时间的先后来纪录的,所以合并后的文件是按照时间的先后顺序。
举个例子:我们有100个已经排好序的序列, 现在要将这一百个序列合并成一个按顺序的序列。
由于并不是研究这么个算法,主要是要尽快地分析问题,我临时写了一个程序:先将代码分享出来,以后可以进行优化
代码
$files
=
array
(
'
60.txt
'
,
'
61.txt
'
,
'
62.txt
'
);
$arrs = array ();
$arr_count = 0 ;
$i = 0 ;
$x = 0 ;
foreach ( $files as $file )
{
$arrs [ $i ++ ] = file ( $file );
$arr_count += count ( $arrs [ $i - 1 ]);
}
$r_arrs = array ();
$t = $i - 1 ;
while ( $t > 0 )
{
$s = intval ( $t / 2 );
for ( $x = $t ; $x > $t - $s ; $x -- )
{
$arrs [ $x - $s ] = merge( $arrs [ $x - $s ] , $arrs [ $x ]);
}
$t = intval (( $t - $s ) / 2 );
}
$arrs [ 0 ] = merge( $arrs [ 0 ] , $arrs [ 1 ]);
file_put_contents ( ' total.txt ' , implode ( '' , $arrs [ 0 ]));
print_r ( $arr_count );
print_r ( count ( $arrs [ 0 ]));
function merge( $arr1 , $arr2 )
{
if ( is_array ( $arr1 ) && is_array ( $arr2 ))
{
$t_arr = array ();
$i = 0 ;
$j = 0 ;
while ( isset ( $arr1 [ $i ]) && isset ( $arr2 [ $j ]))
{
if (( $arr1 [ $i ]) <= ( $arr2 [ $j ]))
$t_arr [] = $arr1 [ $i ++ ];
else
$t_arr [] = $arr2 [ $j ++ ];
}
while ( isset ( $arr1 [ $i ])) $t_arr [] = $arr1 [ $i ++ ];
while ( isset ( $arr2 [ $j ])) $t_arr [] = $arr2 [ $j ++ ];
return $t_arr ;
}
return false ;
}
$arrs = array ();
$arr_count = 0 ;
$i = 0 ;
$x = 0 ;
foreach ( $files as $file )
{
$arrs [ $i ++ ] = file ( $file );
$arr_count += count ( $arrs [ $i - 1 ]);
}
$r_arrs = array ();
$t = $i - 1 ;
while ( $t > 0 )
{
$s = intval ( $t / 2 );
for ( $x = $t ; $x > $t - $s ; $x -- )
{
$arrs [ $x - $s ] = merge( $arrs [ $x - $s ] , $arrs [ $x ]);
}
$t = intval (( $t - $s ) / 2 );
}
$arrs [ 0 ] = merge( $arrs [ 0 ] , $arrs [ 1 ]);
file_put_contents ( ' total.txt ' , implode ( '' , $arrs [ 0 ]));
print_r ( $arr_count );
print_r ( count ( $arrs [ 0 ]));
function merge( $arr1 , $arr2 )
{
if ( is_array ( $arr1 ) && is_array ( $arr2 ))
{
$t_arr = array ();
$i = 0 ;
$j = 0 ;
while ( isset ( $arr1 [ $i ]) && isset ( $arr2 [ $j ]))
{
if (( $arr1 [ $i ]) <= ( $arr2 [ $j ]))
$t_arr [] = $arr1 [ $i ++ ];
else
$t_arr [] = $arr2 [ $j ++ ];
}
while ( isset ( $arr1 [ $i ])) $t_arr [] = $arr1 [ $i ++ ];
while ( isset ( $arr2 [ $j ])) $t_arr [] = $arr2 [ $j ++ ];
return $t_arr ;
}
return false ;
}
当然这个程序的思想还可以对数组排序,记得以前有人问过,如果对有规律的数据进行排序,那么如果有上述的规律,进行多路的合并, 比起对整个程序进行排序化得时间小。
下面是日志的部分内容截图