减少循环执行时间

时间:2017-08-26 08:57:25

标签: php loops while-loop file-handling 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);

1 个答案:

答案 0 :(得分:0)

我发现您使用原始代码可能会影响您的效果时出现一些错误,但我不确定会有多少错误。

如果我理解正确,您将打开一个日志文件并将消息排序为单独的文件。

您没有粘贴日志文件中的示例,但我假设您有重复的文件目标,并非日志文件的每一行都有单独的文件目标。

您的代码会打开,但永远不会关闭句柄,并且在脚本运行期间它会保持打开状态。垃圾收集器不会在外部作用域上关闭文件句柄,您必须手动执行以释放资源。

基于此,你应该存储文件指针(或者至少关闭它们)并重新使用它来处理已经打开的文件。您在执行期间至少打开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);