0

我有一个脚本运行时间过长,我一直在努力优化它以使其更快。我知道需要额外时间的一件事是我必须多次运行相同的查询。我希望能够存储该查询的结果(无需将其写入数据库),以便稍后可以引用它的值而无需再次运行查询。

我正在极大地简化下面的脚本,但希望这能给你一个想法。

假设我有两个函数,每个函数都返回一个值:

    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 个单独的查询。是否可以存储每个查询的初始运行?我想到的一件事是这样做:

    $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 时每个只运行一次吗?是否有另一种方法可以考虑我没有想到的?

谢谢你的帮助!

4

1 回答 1

2

是的,这将导致您的查询只运行一次。如果您想确保它们在每个会话中运行一次,而不是每次都手动将结果缓存在变量中,您可以查看具有一些缓存能力的 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_*函数系列接触数据库。这隔离了变化;如果您一开始就围绕您的数据库访问实现了一个小型包装器,那么您现在只有一个地方可以更改,以便放弃过时的mysql_query函数以支持 PDO。

于 2012-06-29T14:40:56.853 回答