我能以某种方式全局暂时保存函数的返回数据吗?


Can I somehow globally and temporarily save the return data of a function?

如果我们有一个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)

我能做的:

我可以根据每个组合存储函数的结果,并检查它之前是否已经计算过。我可以将它存储到$_SESSION中,每个用户,这样每次调用函数时,结果都会在$_SESSION中查找。

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

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

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

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

如果函数被修改,则可以擦除数据库

您可以在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);
}

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

  1. APC - http://php.net/manual/en/book.apc.php
  2. Memcache - http://memcached.org/
  3. 内存(MySQL存储引擎)- http://dev.mysql.com/doc/refman/5.5/en/memory-storage-engine.html

Memcache将自动处理可用内存,所以如果你要在限制上多存储1字节,Memcache将删除最老的存储值以"腾出空间"。APC。

APC和Memcache的区别在于APC不需要单独安装,也不是分布式的,所以你不能把数据存储在APC上,然后从服务器池中获取这些数据。如果您的应用程序运行在单个服务器上,这是最佳解决方案。

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

我认为APC是您最好的解决方案。

为什么不将组合/结果存储在一个数组中,json_encode()它,然后写入一个文件。在需要时加载该文件,并使用json_decode()方法加载。