是否为每个用户创建高效缓存文件?

时间:2014-04-13 14:33:04

标签: php caching

所以我们在同一页面上,我正在构建一个PHP类,使用他们的Web服务https://sessionserver.mojang.com/session/minecraft/profile/从Mojang进行用户名查找。我想缓存一小时的结果,但是我需要为成千上万的用户做这件事。我现在设置它的方式是该类为我做的每个请求创建一个缓存文件。一旦我将它投入生产,将产生数千个文件,我不确定它们是否非常有效。

  1. 这是一种有效的方法吗?
  2. 这是否会导致任何性能问题。
  3. 如果效率不高,每天删除所有缓存文件会不会很好?
  4. 班级不大,我在一小时内写完了。

    class Player {
        private $_uuid,
                $_username;
    
        private function fetch($id) {
            $query = 'https://sessionserver.mojang.com/session/minecraft/profile/' . $id;
    
            if(file_exists('core/classes/cache/'. $id .'.cache') && (filemtime('core/classes/cache/'. $id .'.cache') > (time() - 60 * 60 ))) {
                // Less than 60 minutes, pull from cache
    
                $data = json_decode(file_get_contents('core/classes/cache/'. $id .'.cache'));
    
    
            } else {
                // Over 60 minutes, fetch and store to cache
    
    
    
                $data = json_decode(file_get_contents($query));
                file_put_contents('core/classes/cache/'. $id .'.cache', json_encode($data));
    
    
            }
    
    
    
                $this->_username = $data->name;
    
                return $this->_username;
    
        }
    
        public function username($uuid) {
            return $this->fetch($uuid);
        }
    

    所以这很好,它返回所需的内容并成功创建缓存文件。你们有什么感想?有没有更好的方法来缓存这些信息?

    用法:

    $user = new Player;
    
    echo $user->username('c3fed4d91c024fb89bf1cb0166aa9104');
    

    返回Wingzzz (Username of this id)

    创建一个名为c3fed4d91c024fb89bf1cb0166aa9104.cache的缓存文件,其中存储了json对象。

1 个答案:

答案 0 :(得分:1)

查看像memcached这样的内存缓存系统。这是一个更好,更快的解决方案,不会消耗磁盘空间。

您还可以实现一个系统,其中每个缓存项目的生命周期都非常短,但每次用户访问该站点时,生命周期都会延长(一次访问该站点并离开的用户将不会拥有其缓存数据长时间呆在内存中,但是停留在网站上的用户不必等待他们的数据被提取,因为它保留在缓存中。

虽然memcached可能是最容易设置的系统,但您也可以设置具有更丰富数据结构的Redis。 Memcached仅支持平面值,但您可以json_encode存储在其中的任何内容。


对于基于磁盘的系统,如果没有太多用户,可能会没问题。主要关注的是磁盘IO性能和存储,具体取决于文件的大小。如果它们超过一小时,您可以实施一个cron作业来每小时清理这些文件。

您可能希望查看使用PHP会话存储数据,PHP会话在一段时间后由PHP自动删除,并存储在文件系统中。这将使您的实施更容易。


最后,您可能希望根本不考虑存储数据。相反,为什么不为您要存储的数据设置cookie,让客户端传输您需要的所有数据?您必须使用与hash_hmac签名的系统来验证您的数据是否未被篡改,但这种方式对您的服务器的影响最小。