如果我们有一个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);
}
我建议三个简单的解决方案:
- APC - http://php.net/manual/en/book.apc.php Memcache - http://memcached.org/
- 内存(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()方法加载。