Php 我是否可以全局临时保存函数的返回数据?

Php 我是否可以全局临时保存函数的返回数据?,php,Php,如果我们有一个PHP函数,它根据特定的输入进行困难的计算,例如: function count_score($var1, $var2, $var3){ // based on $var1, $var2 and $var3 we run // a 5000-lines long calculation, // resulting in one $output return $output; } 现在,这里发生了什么: 该函数运行大约需要1秒 可能输入的$var1、$va

如果我们有一个PHP函数,它根据特定的输入进行困难的计算,例如:

function count_score($var1, $var2, $var3){
   // based on $var1, $var2 and $var3 we run
   // a 5000-lines long calculation,
   // resulting in one $output
   return $output;
}
现在,这里发生了什么:

  • 该函数运行大约需要1秒
  • 可能输入的$var1、$var2和$var3组合不多(大约3000个)
我能做的是:

我可以存储基于每个组合的函数结果,并检查它之前是否计算过。我可以将它存储到每个用户的$\u会话中,因此每次调用该函数时,都会在$\u会话中查找结果

但是,如果我想为所有用户存储这些结果呢?我不能使用$\u会话,因为它不是为所有用户在整个站点上共享的。那我怎么储存呢

计算结果不同的唯一时间是我改变函数的时候,大约每48小时发生一次。然后,我可能可以手动指定函数修订并检查该修订的结果。但是我如何/在哪里储存这些


编辑可选地,该方法应该在CRON中工作(没有http层),但它不是必需的。

您可以将组合存储在数据库中,并在其中查找。因此,它在用户之间共享


如果修改了函数,则可以删除数据库。

为什么不将组合/结果存储在一个数组中,json_encode()将其编码,然后写入一个文件。在需要时加载文件并进行json_decode()解码。

您可以将临时数据保存在memcached中,只需执行以下操作:

$m = new Memcached();
$m->addServer('localhost', 11211);

$key = "count_score_result_{$var1}_{$var2}_{$var3}";
$result = $m->get($key);
if(!$result){
    $result = count_score($var1,$var2,$var3);
    $result = $m->set($key,$result,15000);
}

我建议三个简单的解决方案:

  • APC-
  • Memcache-
  • 内存(MySQL存储引擎)——
  • Memcache将自动处理可用的内存,因此,如果要存储超过限制的1个字节,Memcache将删除最早存储的值以“腾出空间”。APC也是

    APC和Memcache之间的区别在于,APC不需要单独安装,也不是分布式的,因此您无法将数据存储在APC上并从服务器池中获取这些数据。如果应用程序在一台服务器上运行,这将是最好的解决方案

    有了内存,您可以创建一个更易于维护和设置的经典MySQL表。内存大约与APC和Memcache一样快,因为有了这个存储引擎,所有的数据都保存在RAM中,因此,如果重新启动服务器,您将丢失表中存储的所有数据,但它非常快,适合您的需要


    在我看来,APC是您的最佳解决方案。

    是的,这是一个解决方案。问题是每次调用函数时连接到数据库并获取结果是否是一个好主意。可能是的,除非有人提出另一个想法。你必须通过衡量哪个选项消耗更少的时间和资源来决定。每次或数据库查找和维护时调用该函数。您可以在每个会话中从SQL中提取一次,并将结果保存在会话变量中,以保存数据库调用。到目前为止,这似乎是最好的解决方案,在CRON中也能很好地工作。现在我想知道是否最好使用memcached,或者存储在SQL中,并为每个用户检索到$\u会话。有什么想法吗?memcached会比Sql快,它到底有多快?要么是我做错了什么,要么不是真的那么快。我已经在300次迭代中测试了它。不使用memcached需要0.2秒,使用memcached需要0.45秒。奇怪。。。