PHP开发也有几个月了,感觉php缓存是很重要的一块,无论是页面级的(主要指smarty)还是dao级的。使用上还不怎么熟,但还是记录下笔记。本篇讲述的缓存是写到磁盘文件,这是看piwik源码时看到的,感觉思想很好,这也得益于PHP的var_export 方法。主要把要保存的内容(int,string,也可以使array)保存为php文件,这样当include这个php文件后,保存的内容就自动当做变量被include进来了。
源码如下:
<?php
class Piwik_CacheFile
{
protected $cachePath;
protected $cachePrefix;
function __construct($directory)
{
$this->cachePath = PIWIK_USER_PATH . '/tmp/cache/' . $directory . '/';
}
function get($id)
{
$cache_complete = false;
$content = '';
// We are assuming that most of the time cache will exists
$ok = @include($this->cachePath . $id . '.php');
if ($ok && $cache_complete == true) {
return $content;
}
return false;
}
function set($id, $content)
{
if( !is_dir($this->cachePath))
{
Piwik_Common::mkdir($this->cachePath);
}
if (!is_writable($this->cachePath)) {
return false;
}
$id = $this->cachePath . $id . '.php';
$cache_literal = "<"."?php\n\n";
$cache_literal .= "$"."content = ".var_export($content, true).";\n\n";
$cache_literal .= "$"."cache_complete = true;\n\n";
$cache_literal .= "?".">";
// Write cache to a temp file, then rename it, overwritng the old cache
// On *nix systems this should guarantee atomicity
$tmp_filename = tempnam($this->cachePath, 'tmp_');
if ($fp = @fopen($tmp_filename, 'wb')) {
@fwrite ($fp, $cache_literal, strlen($cache_literal));
@fclose ($fp);
if (!@rename($tmp_filename, $id)) {
// On some systems rename() doesn't overwrite destination
@unlink($id);
if (!@rename($tmp_filename, $id)) {
// Make sure that no temporary file is left over
// if the destination is not writable
@unlink($tmp_filename);
}
}
return true;
}
return false;
}
function delete($id)
{
$filename = $this->cachePath . $id . '.php';
if (file_exists($filename)) {
@unlink ($filename);
return true;
}
return false;
}
}
分享到:
相关推荐
### PHP 缓存详解 #### 一、缓存的基本概念 **缓存**是一种用于暂时存储数据的技术,目的是为了加快数据访问的速度。在现代软件开发中,缓存扮演着极其重要的角色,尤其对于提高Web应用的性能至关重要。通过缓存,...
- **减少资源消耗**:缓存数据存储在内存中,读取速度快于磁盘,减少了CPU和内存的消耗。 **5. 扩展和优化ObjectCache** 开发人员可以根据需求扩展和优化ObjectCache。例如,可以实现自定义缓存策略,如设置过期...
5. **缓存清理**:提供一个方法来清理全部或部分缓存,以便释放磁盘空间或更新所有数据。 以下是一个简单的PHP文件缓存类的实现示例: ```php class FileCache { private $cacheDir = './cache/'; public ...
文件缓存的核心思想是将动态生成的内容保存到磁盘,当用户再次请求相同内容时,不再执行复杂的计算或查询过程,而是直接从缓存文件中读取。这种方式尤其适用于那些计算成本高、但内容相对静态的数据。 这个“简单...
在构建高性能的Web应用时,PHP缓存与静态化扮演着至关重要的角色。它们能够显著提升网站的响应速度,减少服务器资源的消耗,尤其对于高流量的动态网站来说更是如此。下面将详细探讨这两个概念以及如何在PHP中实现...
PHP缓存通常包括文件缓存、APC(Alternative PHP Cache)、OpCache(PHP内置的opcode缓存)以及数据库缓存等。这里的PHP+Redis缓存类,就是通过Redis来实现这一目的。 2. **Redis缓存**:Redis是一个键值对存储系统...
- **缓存大小限制**:为了避免磁盘空间耗尽,可以设定总的缓存文件数量或大小上限,超出时自动清除最旧的缓存。 - **并发控制**:在多用户环境下,需要考虑并发读写文件的情况,可能需要使用锁机制避免数据竞争。 ...
这个超简单的PHP缓存类主要关注的是文件缓存,这是一种将数据保存到服务器磁盘上的方式。相比于内存缓存,文件缓存的优势在于无需额外的服务器软件支持,但缺点是读写速度相对较慢。 类库下载的"超简单的php缓存类...
- `no-store`:确保请求或响应完全不被缓存,即使是在磁盘缓存中也不行,常用于敏感信息。 - `max-age`:指定响应的最大生存时间,单位为秒。在此时间内,响应被认为是新鲜的,可以直接从缓存中提供。 PHP开发者...
- 提升响应速度:从磁盘读取缓存文件比执行动态脚本快。 - 并发处理:多个用户可以同时访问同一缓存数据,提高用户体验。 3. PHP生成缓存文件的步骤: - 决定缓存内容:确定哪些数据或结果值得缓存,通常包括...
本示例中的“[示例][PHP]文件缓存的php类库.zip”是一个专门为PHP设计的文件缓存工具,旨在帮助开发者更有效地管理数据,降低对数据库的依赖,从而提高应用程序的性能。 文件缓存是将数据存储在本地文件系统中,...
"将响应缓存为磁盘上的静态文件以便快速进行页面加载"这一技术是提高网页加载速度的有效手段,尤其在PHP开发中,Laravel框架提供了一个名为"Laravel Page Cache"的工具,专门用于实现这个功能。Laravel Page Cache...
3. **优化**:定期清理缓存可以释放磁盘空间,防止过量的缓存文件影响服务器性能。 4. **错误修复**:当应用出现异常,可能与缓存有关,清理缓存是一种有效的排查手段。 使用"RunTimeCleaner"这个工具,开发者可以...
- **分层缓存**:Stash支持多级缓存,例如,可以先尝试从内存缓存获取数据,若未命中则再从更慢但容量更大的磁盘缓存查找。 - **缓存池**:可以创建多个独立的缓存池,每个池都有自己的策略和后端,适用于处理不同...
文件缓存将数据保存在磁盘文件中,当需要读取数据时,它会快速打开相应的文件并读取内容。而写入操作则是将新数据写入文件。相比内存缓存,文件缓存的主要优势在于其持久性:即使服务器重启,数据也不会丢失。然而,...
- Redis提供了持久化功能,可以将内存中的数据定期保存到磁盘,而Memcached不提供。 - Redis支持主从复制和集群,可扩展性更强,而Memcached扩展主要依赖于增加服务器节点。 ### 6. 缓存项目的最佳实践 - **缓存...
- **缓存技术**:使用缓存机制,减少对服务器的直接请求,提高访问速度。 - **CDN服务**:结合内容分发网络(CDN),加快文件的分发速度,降低服务器压力。 总结,phpdisk作为一个基于PHP的虚拟磁盘服务,实现了...
然而,文件缓存也有其局限性,比如在高并发环境下可能因磁盘I/O竞争导致性能瓶颈,这时可能需要考虑使用更高效的缓存方式,如Redis或Memcached。 总的来说,理解和熟练运用ThinkPHP的文件缓存类对于提升PHP应用的...
PHP FPM 进程调用 PHP 解析器读取站点磁盘上的 PHP 文件,并加载到内存中。 PHP 解析器将 PHP 程序编译成为 opcode 文件,然后把 opcode 缓存起来。 PHP FPM 引擎执行 opcode 树后,返回数据给 Nginx,进而返回...