减少循环执行时间
Reduce looping execution time
我有 35 秒的时间来执行这段代码。如何减少执行时间?我应该在此源代码中更改什么。
$file_handle = fopen("WMLG2_2017_07_11.log", "r");
while (!feof($file_handle)) {
$line = fgets($file_handle);
if (strpos($line, 'root@CLA-0 [WMLG2] >') !== false) {
$namafileA = explode('> ', $line);
$namafile = str_replace(' ', '_', $namafileA[1]);
$filenameExtension = $namafile.".txt";
$file = preg_replace('/[^A-Za-z0-9\-_.]/', '', $filenameExtension); // hapus special character kecuali "." dan "_"
} else {
$newfile = fopen("show_command_file_Tes2/$file", "a");
fwrite($newfile, $line);
}
}
fclose($file_handle);
我发现您对原始代码所做的一些错误可能会影响您的性能,但我不确定影响有多大。
如果我没理解错的话,您正在打开一个日志文件并将消息分类到单独的文件中。
您没有从日志文件中粘贴示例,但我假设您有重复的文件目标,并非日志文件的每一行都有单独的文件目标。
您的代码打开,但从不关闭句柄,并且它在脚本 运行 期间保持打开状态。文件句柄不会被垃圾收集器关闭在外部范围内,您必须手动执行以释放资源。
基于此,您应该存储文件指针(或至少关闭它们)并重新使用处理已经打开的文件。您在执行期间至少打开了 X 行句柄并且没有关闭它/重新使用它,其中 X 是文件中的行数。
我注意到的另一件事是,您的行可能很长,这是一种罕见的情况,其中 php 的 strpos()
函数可能比匹配字符串正确位置的正则表达式慢.没有日志文件,我不能肯定地说,因为 preg_match()
在简单/短字符串上是非常昂贵的函数(strpos()
更快。)
如果它是一个日志文件,很可能以 "root@CLA"... 字符串开头,如果您可以用 ^
指定字符串位置(字符串的开头),您应该尝试匹配它) 或 $
(字符串结尾)。
<?php
$file_handle = fopen("WMLG2_2017_07_11.log", "r");
//you 'll store your handles here
$targetHandles = [];
while (!feof($file_handle))
{
$line = fgets($file_handle);
if (strpos($line, 'root@CLA-0 [WMLG2] >') !== false)
{
$namafileA = explode('> ', $line);
$namafile = str_replace(' ', '_', $namafileA[1]);
$filenameExtension = $namafile . ".txt";
$file = preg_replace('/[^A-Za-z0-9\-_.]/', '', $filenameExtension); // hapus special character kecuali "." dan "_"
}
else
{
//no $file defined, most likely nothing to write yet
if (empty($file))
{
continue;
}
//if its not open, we'll make them open
if (empty($targetHandles[$file]))
{
$targetHandles[$file] = fopen("show_command_file_Tes2/$file", "a");
}
//writing the line to target
fwrite($targetHandles[$file], $line);
}
}
//you should close your handles every time
foreach ($targetHandles as $handle)
{
fclose($handle);
}
fclose($file_handle);
我有 35 秒的时间来执行这段代码。如何减少执行时间?我应该在此源代码中更改什么。
$file_handle = fopen("WMLG2_2017_07_11.log", "r");
while (!feof($file_handle)) {
$line = fgets($file_handle);
if (strpos($line, 'root@CLA-0 [WMLG2] >') !== false) {
$namafileA = explode('> ', $line);
$namafile = str_replace(' ', '_', $namafileA[1]);
$filenameExtension = $namafile.".txt";
$file = preg_replace('/[^A-Za-z0-9\-_.]/', '', $filenameExtension); // hapus special character kecuali "." dan "_"
} else {
$newfile = fopen("show_command_file_Tes2/$file", "a");
fwrite($newfile, $line);
}
}
fclose($file_handle);
我发现您对原始代码所做的一些错误可能会影响您的性能,但我不确定影响有多大。
如果我没理解错的话,您正在打开一个日志文件并将消息分类到单独的文件中。
您没有从日志文件中粘贴示例,但我假设您有重复的文件目标,并非日志文件的每一行都有单独的文件目标。
您的代码打开,但从不关闭句柄,并且它在脚本 运行 期间保持打开状态。文件句柄不会被垃圾收集器关闭在外部范围内,您必须手动执行以释放资源。
基于此,您应该存储文件指针(或至少关闭它们)并重新使用处理已经打开的文件。您在执行期间至少打开了 X 行句柄并且没有关闭它/重新使用它,其中 X 是文件中的行数。
我注意到的另一件事是,您的行可能很长,这是一种罕见的情况,其中 php 的 strpos()
函数可能比匹配字符串正确位置的正则表达式慢.没有日志文件,我不能肯定地说,因为 preg_match()
在简单/短字符串上是非常昂贵的函数(strpos()
更快。)
如果它是一个日志文件,很可能以 "root@CLA"... 字符串开头,如果您可以用 ^
指定字符串位置(字符串的开头),您应该尝试匹配它) 或 $
(字符串结尾)。
<?php
$file_handle = fopen("WMLG2_2017_07_11.log", "r");
//you 'll store your handles here
$targetHandles = [];
while (!feof($file_handle))
{
$line = fgets($file_handle);
if (strpos($line, 'root@CLA-0 [WMLG2] >') !== false)
{
$namafileA = explode('> ', $line);
$namafile = str_replace(' ', '_', $namafileA[1]);
$filenameExtension = $namafile . ".txt";
$file = preg_replace('/[^A-Za-z0-9\-_.]/', '', $filenameExtension); // hapus special character kecuali "." dan "_"
}
else
{
//no $file defined, most likely nothing to write yet
if (empty($file))
{
continue;
}
//if its not open, we'll make them open
if (empty($targetHandles[$file]))
{
$targetHandles[$file] = fopen("show_command_file_Tes2/$file", "a");
}
//writing the line to target
fwrite($targetHandles[$file], $line);
}
}
//you should close your handles every time
foreach ($targetHandles as $handle)
{
fclose($handle);
}
fclose($file_handle);