2017-08-26 155 views
-1

我得到35秒执行此代码。如何减少执行时间?我应该在这个源代码中改变什么。减少循环执行时间

$file_handle = fopen("WMLG2_2017_07_11.log", "r"); 
while (!feof($file_handle)) { 
    $line = fgets($file_handle); 
    if (strpos($line, '[email protected] [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); 

回答

0

我发现了一些错误,你用原始代码可能会影响你的性能,但我不知道有多少。

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

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

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

基于此,您应该存储文件指针(或至少关闭它们)并重新使用那些已经打开的句柄。在执行过程中至少打开X行句柄,并且不关闭/重新使用它,其中X是文件中的行数。

我注意到的其他事情,你的线可能是长的,这是一个罕见的情况下,PHP的strpos()函数可能比匹配字符串正确位置的正则表达式慢。如果没有日志文件,我不能肯定地说,因为preg_match()是简单/短字符串相当昂贵的功能(strpos()是方式更快。)

如果它的日志文件,最有可能与“根@ 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, '[email protected] [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); 
+0

从你的代码中,变量$文件不确定的,如果你想看到它 这里的日志文件 https://www.dropbox.com/s/z8tvmegokghrjok/WMLG2_2017_07_11.log?dl=0 @Fiber –

+0

是的,你是对的,但我不知道你用这个变量的意图是什么,你正在定义'$ file = preg_replace('/ [^ A-Za-z0-9 \ -_。] /','',$ filenameExtension); // hapus特殊字符kecuali“。” dan“_”')'但是这可能是未定义的。让我编辑我的帖子并纠正它。 – Fiber

+0

$ file = preg_replace('/ [^ A-Za-z0-9 \ - 。] /','',$ filenameExtension)im使用它来删除所有空间,因为如果im没有定义它,文件名将是 ex:show_alarm_active .txt 在最后一个字符串中存在空格,然后我放了扩展名 –