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()
函数中,我只是在查询之前检查数组中是否存在名称。如果没有,请将名称和作业插入数组并返回作业。
基本上,有更好的方法来做到更优雅吗?
答案 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,
希望这有帮助