0

XML ファイル (約 5000 製品) から製品データの割り当てをインポートしています。スクリプトを実行すると、約 10 ~ 12 秒で機能するようになります。

ここで、各製品の説明が句読点記号で終わるようにするこの句読点関数を追加すると、コードはサーバーで php 60 秒のロード時間まで実行されますが、エラーは発生しません。エラー報告をオンにしています。スクリプトを 60 秒で読み込めなかったという最終エラーが表示されます。

問題は、この関数を見て、そのリソースを消費しているのかということです。高速化するにはどうすればよいですか?

コメントによると、問題は pregmatch ループである可能性があります。この関数が何をするのか説明しましょう。文字列の最後の文字が句読点かどうかをチェックします。そうでない場合は、最後の文字と一致し、再度チェックします。

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;
}

preg_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;
}

時間がかかる関数や呼び出される頻度など、コードの実行時間に関する詳細情報を取得するには、Xdebugおよびxhprof拡張機能を調べる必要があります。

于 2012-10-17T17:11:21.500 に答える