二、缓存cache获取的执行流程以及源码解析
既然学习了缓存设置的源码解析,那么也应该来简单的了解一下缓存获取的源码解析。
同样演示案例还是之前的那个,只不过是把set换为get即可
跟设置缓存的流程是一样的,首先会来到门面类中创建缓存的对应实例
门面类创建了缓存类的时候之后就会来到cache类这个文件thinkphp/library/think/Cache.php
在这个文件中可以看到还是使用了__call方法,这个方法就是调用不存在的方法会执行。
接着会来到这init方法,这个方法在设置缓存值的时候已经进行深入讲解了。
根据执行流程我们将会看到init这个方法自动初始化缓存(这里需要注意,第一次并不是在这里进行执行的,而是make方法,当make方法执行完后会把值存放在handler这个属性,第二次通过call方法进来之后就直接返回了,而不会在进行一次执行,这里一定要注意)
这里为什么先会执行cache的make方法,是因为在容器中创建cache类实例的时候会在make方法中判断类中是否存在make方法,如果存在就会先进行执行。
所以说在cache这个类中return call_user_func_array([$this->init(), $method], $args);这块代码会去执行thinkphp/library/think/cache/driver/File.php这个类的get方法
在这个类中你可以看到一个在设置缓存值时花了好久解析的一个方法getCacheKey
在这个方法中主要就是使用了sbustr来进行了加密值的节,前俩个值为目录,其余字符为文件名。
然后将文件名给返回出去。
然后就使用file_get_contents来将文件的内容获取出来
然后可以接着往下看,在这里有一个过期删除缓存文件。
框架中的过期策略是当你设置了过期时间时,缓存过期后不会直接删除而是当你再一次访问之后才会进行删除。
这种策略就是redis中的惰性删除,当我们使用惰性删除时,数据到期了也不会自动删除,那么他的删除方式是,在下一次在获取这个key值时,会做一个判断,判断这个key是否过期,如果过期了在执行删除。
截止到这里关于缓存获取的执行流程已经源码解析就完成了,其实大多数内容在获取的时候就已经解析完了。
那为什么还是要在聊一下获取缓存数据,那是因为在这里还需要给大家在解释一些东西。
三、数据压缩
在设置缓存的时候将缓存的值写入文件时有过一个函数gzcompress
然而在获取缓存值的时候从文件将数据读出时又遇到的一个函数gzuncompress
其实从设置缓存和获取缓存的这俩个功能中就可以看出,设置的为压缩数据,获取的解压数据。
在PHP中关于压缩函数还有其它俩个分别为gzdeflate、gzencode,同样的解压函数也是对应的gzinflate gzdecode
这几个函数虽说都是压缩函数,但是底层实现是不一样的。
gzcompress使用的是ZLIB格式;
gzdeflate使用的是纯粹的DEFLATE格式;
gzencode使用的是GZIP格式;
以上就是关于数据压缩和解压的一些知识,了解即可。
四、总结
在这一节中咔咔带大家领略了框架对于缓存的处理结果。
其实咔咔之前测试过关于框架自带的缓存响应时间应该会缩短三分之一,当然这个也是根据数据量的大小有区别的。
至此关于PHP框架ThinkPHP的源码解读到这里就结束了,后期如果有时间将会对其中一些没有提到的内容在进行解读。
最后说一句阅读源码是真的累。