0

実行に時間がかかりすぎるスクリプトがあり、より高速になるように最適化するように取り組んでいます。私が知っていることの1つは、余分な時間がかかるということです。同じクエリを複数回実行する必要があるという事実です。そのクエリの結果を(データベースに書き込まずに)保存できるようにしたいと思います。これにより、後でクエリを再度実行しなくても、その値を参照できるようになります。

以下のスクリプトを劇的に簡略化していますが、これでアイデアが得られることを願っています。

それぞれが値を返す2つの関数があるとしましょう。

    function a(){
          $query = "SELECT SUM(price) FROM table_1 WHERE zip='$this->zip'"; 
          $result = mysql_query($query) or die(mysql_error());
          while($row = mysql_fetch_array($result)){
          return $row['SUM(price)'];
    }
    function b(){
          $query = "SELECT SUM(price) FROM table_2 WHERE zip='$this->zip'"; 
          $result = mysql_query($query) or die(mysql_error());
          while($row = mysql_fetch_array($result)){
          return $row['SUM(price)'];
    }

関数a()が値10を返し、関数b()が値5を返すとします。

さて、私のスクリプトが次のようなものだとします。

    if (function a() > 5) { echo 'it is greater than 5!' }
    if (function a() < 5) { echo 'it is less than 5!' }
    if (function b() == 5) { echo 'it equals 5!' }
    if (function b() > 10) { echo 'it is not greater than 5!' }

私が物事を正しく理解している場合、上記のスクリプトは私のデータベースの4つの別々のクエリを引き起こします。各クエリの最初の実行を保存することは可能ですか?私が考えた1つのことはこれを行うことでした:

    $a = function a();
    $b = function b();

そして、私のスクリプトを次のようにします。

    if ($a > 5) { echo 'it is greater than 5!' }
    if ($a < 5) { echo 'it is less than 5!' }
    if ($b == 5) { echo 'it equals 5!' }
    if ($b > 10) { echo 'it is not greater than 5!' }

これにより、$aと$bを定義した時点で、クエリが1回だけ実行されますか?私が考えていないことを考慮する別の方法はありますか?

ご協力いただきありがとうございます!

4

1 に答える 1

2

はい、これによりクエリが1回だけ実行されます。毎回結果を変数に手動でキャッシュせずに、セッションごとに1回実行するようにしたい場合は、キャッシュ機能を備えたORMを調べるか、各関数内で静的変数を使用できます。

function a() {
  static $cached_result;
  if (!is_null($cached_result) return $cached_result;

  $query = "SELECT SUM(price) FROM table_2 WHERE zip='$this->zip'"; 
  $result = mysql_query($query) or die(mysql_error());
  while($row = mysql_fetch_array($result)){
    return $cached_result = $row['SUM(price)'];
  }
}

ORMを使用したくない場合はmysql_query、すべての関数を手動で呼び出すのではなく、少なくともデータベースアクセスに関する独自のスリムな一連のラッパー関数を作成する必要があります。mysql_*実際には、アプリが一連の関数を介してデータベースにアクセスするポイントは1つだけである必要があります。これにより、変更が分離されます。そもそもデータベースアクセスの周りに小さなラッパーを実装した場合mysql_query、PDOを優先して古い関数を捨てるために、変更する場所は1つだけになります。

于 2012-06-29T14:40:56.853 に答える