0

我正在从一个 XML 文件(大约 5000 个产品)中导入产品数据的分配。当我运行脚本时,我可以让它在大约 10-12 秒内工作。

现在,当我添加这个确保每个产品描述都以标点符号结尾的标点符号功能时,代码会一直运行到我的服务器上的 php 60 秒加载时间,但我没有收到任何错误。我打开了错误报告。我刚刚收到一个脚本无法在 60 秒内加载的最终错误。

问题是,看看这个函数,是不是很耗资源?我该怎么做才能让它更快?

根据评论,问题可能是预赛循环。让我解释一下这个函数的作用。它检查字符串的最后一个字符是否是标点符号。如果不是,它将匹配最后一个字符并再次检查。

function punctuation($string){
    if(strlen($string) > 5){
        // Get $last_char
        $desired_punctuation = array(".",",","?","!");
        $last_char = substr($string, -1); 
        // Check if $last_char is in the $desired_punctuation array
        if(!in_array($last_char, $desired_punctuation)){ 
        // strip the $mytrim string and get only letters at the end;
            while(!preg_match("/^[a-zA-Z]$/", $last_char)){
                $string = substr($string, 0, -1);
                $last_char = substr($string, -1);
            }
            // add "." to the string
            $string .= '.'; 
        } 
    }
    return $string;
}

如果函数没问题,那么长的运行时间必须来自我必须发现的其他东西。

我只是想要你对这部分的意见。

4

1 回答 1

2

看起来您应该能够用单个循环替换 while 循环preg_replace()

function punctuation($string){
  if(strlen($string) > 5){
    // Get $last_char
    $desired_punctuation = array(".",",","?","!");
    $last_char = substr($string, -1); 
    // Check if $last_char is in the $desired_punctuation array
    if(!in_array($last_char, $desired_punctuation)){ 
      // remove any trailing non-word characters, and add a period
      $string = preg_replace("/[\W]*$/", '.', $string);
    } 
  }
  return $string;
}

如果 apreg_match()也可以比它更快,则必须对其进行测试in_array()

function punctuation($string){
  if(strlen($string) > 5){
    // Check if the last character is a desired punctuation character
    if(!preg_match("/[.,?!]$/", $string)){ 
      // remove any trailing non-word characters, and add a period
      $string = preg_replace("/[\W]*$/", '.', $string);
    } 
  }
  return $string;
}

要获取有关代码运行时间的更多详细信息,包括哪些函数需要很长时间以及它们被调用的频率,您应该查看Xdebugxhprof扩展。

于 2012-10-17T17:11:21.500 回答