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

Php 为每个用户创建缓存文件是否有效?,php,caching,Php,Caching,所以我们在同一个页面上,我正在构建一个PHP类,使用Mojang的web服务https://sessionserver.mojang.com/session/minecraft/profile/。我想把我得到的结果缓存一个小时,但是,我需要为成千上万的用户这样做。我现在设置它的方式是,该类为我执行的每个请求创建一个缓存文件。一旦我将其投入生产,将生成数千个文件,我不确定这些文件是否非常有效 这是一种有效的方法吗 随着时间的推移,这会导致性能问题吗 如果效率不高,每天删除所有缓存文件是否好 这门课

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

  • 这是一种有效的方法吗
  • 随着时间的推移,这会导致性能问题吗
  • 如果效率不高,每天删除所有缓存文件是否好
  • 这门课不大,我在一小时内就写完了

    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(此id的用户名)


    创建名为c3fed4d91c024fb89bf1cb0166aa9104的缓存文件。缓存中存储有json对象。

    查看类似的内存缓存系统。这是一个更好更快的解决方案,不会占用磁盘空间

    您还可以实现一个系统,其中每个缓存项的生命周期都非常短,但每次用户访问站点时,生命周期都会延长(访问站点一次并离开的用户不会让缓存的数据长时间存储在内存中,但留在站点上的用户不必等待数据被提取,因为数据仍保留在缓存中)

    虽然memcached可能是最容易安装的系统,但您也可以安装具有更丰富数据结构的Redis。memcached只支持平面值,但您可以
    json\u encode
    存储在其中的任何内容


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

    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);
        }
    
    您可能需要考虑使用PHP会话来存储数据,PHP会在一段时间后自动删除这些数据,并将其存储在文件系统中,这将使您的实现更加容易



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

    这似乎是可行的e运行cron作业以删除缓存目录中的所有文件,因为这些缓存文件相对较小。我将如何设置此cron作业?我以前从未在服务器上创建过一个cron作业。请查看Linux cron的工作原理。基本上,您可以向crontab添加一个条目,该条目可以调用PHP清理脚本,也可以使用bash命令来为您执行清理这很容易。如果你在共享主机提供商上,你可能需要使用控制面板来完成。cPanel/Plesk支持cron。