Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 缓存昂贵的计算-正确的方法?_Php_Performance_File Io_Include - Fatal编程技术网

Php 缓存昂贵的计算-正确的方法?

Php 缓存昂贵的计算-正确的方法?,php,performance,file-io,include,Php,Performance,File Io,Include,这是我昨天提问的后续内容——有一条评论问我为什么不将“缓存”存储在数据库中(我测试了一个文件夹体系结构,其中数百万个文件夹被拆分成不同的子文件夹,每个子文件夹最多可容纳1000个),这让我开始思考正确的解决方案 基本上,这里更详细一点:我有一个昂贵的计算,需要很多数据库查询。基本上,程序的每个请求都以特定用户为目标。对于每个用户,结果总是完全相同的(直到用户做出重大更改)。所以基本上,我在想:为什么每次有人访问这个用户页面时都要做这个操作——如果我能做一次,然后保存它 基本上,结果是一组不同的

这是我昨天提问的后续内容——有一条评论问我为什么不将“缓存”存储在数据库中(我测试了一个文件夹体系结构,其中数百万个文件夹被拆分成不同的子文件夹,每个子文件夹最多可容纳1000个),这让我开始思考正确的解决方案

基本上,这里更详细一点:我有一个昂贵的计算,需要很多数据库查询。基本上,程序的每个请求都以特定用户为目标。对于每个用户,结果总是完全相同的(直到用户做出重大更改)。所以基本上,我在想:为什么每次有人访问这个用户页面时都要做这个操作——如果我能做一次,然后保存它

基本上,结果是一组不同的PHP对象,包含不同的数据/设置等。因此我考虑创建一个
.inc
文件,创建这些对象(使用预定义值,这将由SELECT产生)。每次有人打电话给那个特定的用户,我都会快速地
include
,问题就解决了

现在我对这个解决方案不再那么确定了。这意味着,基本上每个用户都至少有一个
.inc
(可能有多个)文件要包含。这意味着,如果用户表的
PK
有一个
UNSIGNED MEDIUMINT
,我需要一个文件夹结构来支持至少8388607*~2个文件(最坏情况)

我想我找错方向了。我的可能性是什么

  • 在每次页面调用中选择数据并计算/将其放在一起-始终具有相同的结果
  • 与2相同,但将生成的对象存储在文件中,作为代码段-包含
  • 与2相同,但序列化生成的对象,将其保存在文件或数据库中,并在每次页面调用中取消序列化
  • ?
  • 是否有其他解决此类问题的解决方案/方法?所有这些解决方案在我自己的耳朵里听起来都不太干净,但我正在努力寻找另一种方法来做到这一点。持有800万个文件,或者一遍又一遍地计算同一件事——两者之间应该有某种联系

    有什么建议吗


    谢谢请原谅我的英语不好。

    我认为这里有很多选项供您选择,但如果没有更多细节,很难选择最好的选项:

    如果这些对象不太可能在自己的表中不断更改,则可以将其半缓存在数据库表中,并且只有在半缓存表中找不到结果时才进行昂贵的计算(半缓存表也会将其放置在半缓存表中)。您甚至可能希望有一个定期(如每晚)更新这些的时间表,以利用服务器上的停机时间

    您可以将结果存储在会话或cookie中,并根据需要进行检查,如果不存在,则从数据库中进行计算


    使用mySQL缓存来存储这些昂贵的计算,以便根据需要将它们存储在缓存中。这可能意味着您需要与预期的访问者一起预热缓存。

    感谢他们的输入,他们帮助我测试了几件事情-我发现存储在DB中毕竟不是正确的解决方案-直接查找已经gziped的文件会更好地避免DB调用