请帮助解释一下PHP的缓存问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请帮助解释一下PHP的缓存问题相关的知识,希望对你有一定的参考价值。

php缓存技术 WEB程序获取信息的方式主要是查询数据库,当数据库不是很大的情况下不会有太大的问题.然而,随着网站的发展,数据库呈几何级数的方式增长的时候,就会出现瓶颈.于是PHP缓存技术诞生了.PHP缓存技术工作时,当程序查询数据的时候,会把相应的结果序列化后保存到文件中,以后同样的查询语句就可以不用直接查询数据库,而是从缓存文件中获得。这一改进使得程序运行速度得以太幅度提升.
目前应用PHP缓存技术比较流行的方法主要是Adodb+Smarty这样的黄金搭档.
PHP缓存技术工作原理:
首先看看adodb提供的数据缓存功能:
1<?php
2include('adodb.inc.php'); # load code common to ADOdb
3$ADODB_CACHE_DIR = '/usr/ADODB_cache';
4$conn = &ADONewConnection('mysql'); # create a connection
5$conn->PConnect(' http://www.aboutstudy.net ','userid','','agora');# connect to MySQL, agora db
6$sql = 'select CustomerName, CustomerID from customers';
7$rs = $conn->CacheExecute(15,$sql);
8?> 如上,每次查询数据的时候,会把相应的结果序列化后保存到文件中,以后同样的查询语句就可以不用直接查询数据库,而是从缓存文件中获得。
再来看看Smarty提供的页面缓存功能:
1<?php
2require('Smarty.class.php');
3$smarty = new Smarty;
4$smarty->caching = true;
5if(!$smarty->is_cached('index.tpl'))
6 // No cache available, do variable assignments here.
7 $contents = get_database_contents();
8 $smarty->assign($contents);
9
10$smarty->display('index.tpl');
11?>
12
如上,每次访问页面的时候,都会先检测相应的缓存是否存在,如果不存在,就连接数据库,得到数据,完成模板变量的赋值,显示页面,同时生成缓存文件,这样下次访问的时候缓存文件就发挥作用了,而不会再执行if块的数据查询语句了。当然,在实际使用中会有很多东西要考虑,比如,有效期的设置,缓存组的设置等等,具体可以查看Smarty手册中有关缓存(caching)的相关章节。
以上两个PHP流行组件缓存方式的侧重点是不同的,对于Adodb的缓存而言,它缓存的是数据,对于Smarty的缓存而言,它缓存的是页面。其他提供缓存功能的组件还有很多(如:PEAR::Cache_Lite等等),实际编程中使用哪个方案要具体情况具体分析,也可能会综合使用。
使用这些组件内置的缓存方案有一个很明显的好处是它们的实现对客户端而言都很透明。只要进行必要的设置(如:缓存时间,缓存目录等等)就可以了,而不用过多考虑实现缓存的细节问题,系统会根据设置自动管理缓存。但是其缺点也同样明显,因为每次请求仍然要用PHP解析一遍,效率和纯静态相比还是大打折扣,在大的PV面前还是不能满足要求,在这种情况下,仅仅做动态缓存就不够了,必须实现静态缓存。
PHP,一门最近几年兴起的web设计脚本语言,由于它的强大和可伸缩性,近几年来得到长足的发展,php相比传统的asp网站,在速度上有绝对的优势,想mssql转6万条数据php如需要40秒,asp不下2分钟.但是,由于网站的数据越来越多,我们渴求能更快速的调用数据,不必要每次都从数据库掉,我们可以从其他的地方,比方一个文件,或者某个内存地址,这就是php的缓存技术,也就是Cache技术.
参考技术A 先把PHP放在OMP里面然后就好了 参考技术B 百度一下,一下子说不好

请解释一下这个泄漏

【中文标题】请解释一下这个泄漏【英文标题】:Please explain me about this leak 【发布时间】:2011-10-13 04:01:29 【问题描述】:

我的日志中有以下错误消息:

2011-10-13 10:41:44.504 Provision[386:6003] *** __NSAutoreleaseNoPool(): Object 0x4e0ef40 of class CABasicAnimation autoreleased with no pool in place - just leaking
2011-10-13 10:41:44.505 Provision[386:6003] *** __NSAutoreleaseNoPool(): Object 0x4b03700 of class NSConcreteValue autoreleased with no pool in place - just leaking
2011-10-13 10:41:44.506 Provision[386:6003] *** __NSAutoreleaseNoPool(): Object 0x4b04840 of class __NSCFDictionary autoreleased with no pool in place - just leaking

当我运行以下代码时出现错误消息。

CGRect newFrame = [viewTop frame];
newFrame.origin.x = 0;
newFrame.origin.y = 0;
[UIView beginAnimations:@"nil1" context:nil];
[UIView setAnimationDuration:0.3f];
[viewTop setFrame:newFrame];
[UIView commitAnimations];

有什么见解吗?谢谢你的好意

【问题讨论】:

【参考方案1】:

发生这种情况是因为您在不存在自动释放池的情况下使用了自动释放的对象。你可以阅读更多关于NSAutoreleasePool here的信息。

在您的可可开发过程中,您可能已经看到过这样的表达方式:

@"string text"
[NSMutableArray arrayWithCapacity: 42]
[someObject autorelease]

所有这些都使用了自动释放池。在前两种情况下,会为您向对象发送autorelease 消息。在最后一种情况下,我们将其显式发送给对象。 autorelease 消息说“当最近的自动释放池耗尽时减少引用计数。”这是一个例子:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSObject *myObject = [[NSObject alloc] init]; // some object
[myObject autorelease]; // send autorelease message
[pool release]; // myArray is released here!

正如您可能想象的那样,如果您autorelease 一个对象希望池稍后释放它,则可能会发生内存泄漏。 Cocoa 检测到这一点并抛出您在上面发布的错误。

通常在 Cocoa 编程中,NSAutoreleasePool 始终可用。 NSApplication 的运行循环在每次迭代时都会耗尽它。但是,如果您在主线程之外工作(即,如果您创建了自己的线程)或者如果您在调用NSApplicationMain[NSApp run] 之前工作,则不会有一个自动释放池。您通常可以通过添加一个来解决此问题:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
CGRect newFrame = [viewTop frame];
newFrame.origin.x = 0;
newFrame.origin.y = 0;
[UIView beginAnimations:@"nil1" context:nil];
[UIView setAnimationDuration:0.3f];
[viewTop setFrame:newFrame];
[UIView commitAnimations];
[pool release];

【讨论】:

以上是关于请帮助解释一下PHP的缓存问题的主要内容,如果未能解决你的问题,请参考以下文章

php 数据缓存

php 缓存之 APC 和apcu

PHP - file_exists 还是数组缓存?

内存缓存与。内存缓存 [重复]

谁给我解释一下一级缓存和二级缓存啊~

http缓存机制