缓存PHP变量供以后使用

时间:2012-11-17 08:56:56

标签: php caching

PHP进行变量缓存的最佳方法是什么?例如,假设我有一个包含4行的表。

         name |  job
--------------------------
 Justin Smith | Plumber
 Jack Sparrow | Carpenter
 Justin Smith | Plumber
  Katie White | Doctor

构建如下:

foreach($people as $person) {
   echo $person->name;
   echo get_job($person->name);
}

函数调用get_job()看起来像:

function get_job($name) {
  //This is pseudo code below
  $row = MySQL->Query("SELECT job FROM people WHERE name = $name");
  return $row->job;
}

正如您所看到的,一旦我们完成Justin Smith的工作,我们不应该再也不需要再次执行完整的MySQL查询,因为我们知道它是Plumber

我在考虑做一个全局变量,它是一个key=>value数组,如:

 global $jobs = array("Justin Smith" => "Plumber",
                      "Jack Sparrow" => "Carpenter",
                      "Katie White" => "Doctor");

然后在get_job()函数中,我只是在查询之前检查数组中是否存在名称。如果没有,请将名称和作业插入数组并返回作业。

基本上,有更好的方法来做到更优雅吗?

2 个答案:

答案 0 :(得分:1)

有许多可能的解决方案。您可以将SQL结果存储在可以在页面上的多个位置使用的数组中。您应该使用global代替static

 function get_job($name) 
 {
      static $people_jobs;

      if( !isset($people_jobs[$name]) || empty($people_jobs[$name]) )
      {
          $row = MySQL->Query("SELECT job FROM people WHERE name = $name");
          $people_jobs[$name] = $row->job;
      }

      return $people_jobs[$name];
}

此函数只会为一个人执行一次MySQL查询,无论您拨打多少次get_job($name);

答案 1 :(得分:0)

这是典型的n + 1 problem,您在其中进行1次查询以获取“人物”列表,然后为每个人进行一次查询以获得“工作”。

根据它们的相关性...也许你可以使用一个查询得到两者。例如:如果关系是Nx1(1人有1个工作,1个工作可以用于N人),那么您的初始查询应该是这样的:

SELECT p.name, j.job FROM Person p INNER JOIN Job j ON (p.job_id = j.id) 

如果关系是NxN,则会变得棘手:P,

希望这有帮助