在PHP中缓存变量

时间:2010-12-13 19:33:04

标签: php caching optimization

长话短说,我正在寻找快速有效存储的最佳方法,主要是布尔变量,例如:

  • 当前用户是否浏览过此页面? (布尔型)
  • 当前用户是否已对此页面投票? (再次布尔)
  • 今天这位用户有多少次获得投票积分? (整数)

这些变量将仅存储一天,即每天午夜将被删除。

我可以想到五种方法来实现这一目标,但我不知道如何正确地加速测试,所以我当然可以使用这方面的帮助。

1。单个文件 - 单个变量

第一个想法是将一些变量存储在像<?php $___XYZ = true;这样的文件中,然后包含它并返回$___XYZ。问题是,很可能会有数百个这些变量,这可能会占用大量空间(因为,如果我错了,请纠正我,每个文件占用最少约4KB的空间,具体取决于分区格式)。 Big plus是易于访问,易于使用,并且在一天开始时易于清除整个事物(只需删除包含内容的整个文件夹)。访问速度有任何问题吗?

2。单个文件 - 许多变量

我可以用一种方式将变量组存储在一个文件中:

0:1
1:1
14:0
154:0

然后使用fgets查找和读取变量,但是编写中间文件呢?可以有效使用fwrite吗?我不太相信这种方式比1.好多了,但你怎么看?

3。 APC

使用apc_store和其他人来存储,修改和访问数据。我在这里有三个问题 - 我在某处看到启用APC可能会严重降低您的网站速度,缓存有时会出现奇怪的问题,我很好奇如何有效地删除“每日”缓存,并留下我可能拥有的任何其他内容缓存?它存储了数十万个变量有多好?

4。 MySQL数据库

我可以创建一个包含两行(名称和变量)的表但是...我觉得与上述选项中的任何一行相比,它会非常缓慢。


总结一下 - 在PHP中存储变量的哪些方法最好?或者也许有更好的东西?

5 个答案:

答案 0 :(得分:2)

对于分析,您可以使用Xdebug,它在已定义的文件夹中存储分析信息,并使用webgrind查看分析数据。

我在php.ini中为xdebug设置:

zend_extension=C:/WEB/PHP-ts/php_xdebug-2.1.0-5.3-vc6.dll
xdebug.collect_params=4
xdebug.show_local_vars=on
xdebug.scream=1
xdebug.collect_vars=on
xdebug.dump_globals=on
xdebug.profiler_enable=1
xdebug.profiler_output_dir=C:/WEB/_profiler/
xdebug.profiler_output_name=cachegrind.%s.out
xdebug.collect_return=1
xdebug.collect_assignments=1
xdebug.show_mem_delta=1

我发现blog post有关缓存性能的比较(但是从2006年开始!):

Cache Type                Cache Gets/sec

Array Cache                       365000
APC Cache                          98000
File Cache                         27000
Memcached Cache (TCP/IP)           12200
MySQL Query Cache (TCP/IP)          9900
MySQL Query Cache (Unix Socket)    13500
Selecting from table (TCP/IP)       5100
Selecting from table (Unix Socket)  7400

答案 1 :(得分:2)

memcached怎么样?这真的很快,当你只是存放bools时,它们都适合内存而没问题。这绝对是他们所有人中最快的选择。在午夜,您可以轻松读出当天收集的所有统计数据并清除缓存。

答案 2 :(得分:1)

使用memcached,您可以将变量存储在内存中并设置其到期时间,以便它们可以像每天一样旋转。

Memcached比你列出的任何其他方法都快,如果你是新手,请尝试this class我做了。

答案 3 :(得分:1)

我最喜欢这样做的方式是#2的变体,我从数字对中制作一个数组。然后很容易序列化数组并将其保存到文件中。

对于您的应用程序,如果多个访问者/进程需要同时访问阵列,则这会有一个缺点。也许通过为每个用户使用单独的文件来解决这个问题。

答案 4 :(得分:1)

我会选择mySQL和/或内存缓存,如APC或memcache。

老实说,对于大多数操作来说,正确索引的数据库表可能会非常快。您可以通过比较时间戳的DELETE语句轻松清除所有记录。 它肯定比文件系统上的home-brew解决方案更快。假设您已经在网站的其余部分使用mySQL,则无需担心额外的存储层。

编辑:我还想指出内存是不稳定的。如果您的服务器断电,如果某个地方(如数据库)没有持久存在,您的数据就会消失。