gpt4 book ai didi

php - 脚本太慢如何避免多次运行相同的查询?

转载 作者:行者123 更新时间:2023-11-29 08:50:55 24 4
gpt4 key购买 nike

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

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

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

    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 时仅运行一次吗?还有其他我没有想到的方法吗?

感谢您的帮助!

最佳答案

是的,这将导致您的查询仅运行一次。如果你想确保它们每个 session 运行一次,而不是每次都手动将结果缓存在变量中,你可以研究具有一定缓存能力的 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。

关于php - 脚本太慢如何避免多次运行相同的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11263820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com