0

如果我们有一个 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 小时发生一次。然后我可能可以手动指定功能修订并检查该修订的结果。但是我如何/在哪里存储所有这些?

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

4

4 回答 4

1

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

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

于 2013-06-20T07:43:37.727 回答
1

您可以将临时数据保存在 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);
}
于 2013-06-20T07:49:03.677 回答
0

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

于 2013-06-20T07:46:17.417 回答
0

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

  1. APC - http://php.net/manual/en/book.apc.php
  2. 内存缓存 - 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 是最适合您的解决方案。

于 2013-06-20T07:52:15.363 回答