想了解WordPress对象缓存的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于ObjectCache详细介绍和使用的相关问题,此外,我们还将为您介绍关于--no-cacheVs的Alpin
想了解WordPress 对象缓存的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于Object Cache详细介绍和使用的相关问题,此外,我们还将为您介绍关于--no-cache Vs的Alpine Dockerfile的优势。rm / var / cache / apk / *、.net – 新{object} vs {object} = new {object}、angular – 无法解析AuthenticationService的所有参数:([object Object],?,[object Object])、ASP.NET list的新知识。
本文目录一览:- WordPress 对象缓存(Object Cache)详细介绍和使用(wordpress 对象存储)
- --no-cache Vs的Alpine Dockerfile的优势。rm / var / cache / apk / *
- .net – 新{object} vs {object} = new {object}
- angular – 无法解析AuthenticationService的所有参数:([object Object],?,[object Object])
- ASP.NET list
WordPress 对象缓存(Object Cache)详细介绍和使用(wordpress 对象存储)
memcached 内存缓存可以优化
要深度理解 WordPress 优化,必须要首先了解 WordPress 对象缓存 机制。
WordPress 对象缓存机制和服务器设置
WordPress Object Cache(WordPress 对象缓存)是 WordPress 的缓存机制,它的主要功能是把负责查询或者运算的结果按照 Key-Value 这样的方式(WordPress 还支持按照 Group 来划分和避免缓存的内容冲突)存储到对象里面,下次进行同样操作的时候,可以让直接从这个对象中取出数据,不用重复到数据库中或者其他外部网站获取数据。
WordPress Object Cache 和服务器设置关系很大,如果系统开启了 Memcached 内存缓存,则这个对象是直接存入到内存,在数据未过期之前,以后再次读取这个数据都是直接从内存中读取的,这样效率和速度都非常快的。
如果服务器不支持内存缓存的话,则只能保证在当前页面下同样的查询或者操作不再重复从数据库中读取了。
WordPress 对象缓存的函数
使用 WordPress 对象缓存技术其实是非常简单的:
使用 wp_cache_add() 把数据添加到缓存中。
使用 wp_cache_set() 把数据设置到缓存中。
使用 wp_cache_get() 到缓存中读取数据。
使用 wp_cache_delete() 删除缓存中的数据。
这些函数会涉及到的四个参数:
参数
$key 对象的 key。
$data 要存的值。
$group 分组,可选参数,用来把缓存对象就行分组。
$expire 过期时间,可选参数,如果是默认缓存,这个参数没用,如果是内存缓存,是设置缓存的时间,单位是秒,默认为0(0的意思就是永远,不会自动过期)。
使用 WordPress 对象缓存
下面以我即将更新 WordPress 相关文章插件为例,讲讲如何使用 WordPress 对象缓存:
我们知道 WordPress 相关文章插件是通过 tag 和分类来获取相关文章,相同的 tag 和分类越多,相关性越强,这样就需要进行多个表联合查询来获取相关文章,这样效率其实是比较差的。但是一个文章它的相关文章一段时间内是不会变动的,所以我们就可以使用 WordPress 对象缓存对相关文章进行加速。
下面是把把相关文章的数据写入缓存的例子,使用当前 post_id 作为 key,related_posts 作为 group,缓存时间为一个小时,即 3600 秒。
global $post; $related_posts_data = wp_get_related_posts(); wp_cache_set($post->ID,$related_posts_data,'related_posts',3600);
上面只是把数据存到缓存对象中,我们在显示相关文章的时候,就要去调用这个对象缓存来使用,首先检查下是否已经有了缓存,如果你要的信息没有在缓存中,或者已经过期了。wp_cache_get() 会返回 false,如果这样,你就要去数据库中重新获取这些信息。否则就返回在缓存中的信息。
global $post; $related_posts_data = wp_cache_get($post->ID,'related_posts'); if(false === $related_posts_data){ $related_posts_data = wp_get_related_posts(); wp_cache_set($post->ID,$related_posts_data,'related_posts',3600); } echo $related_posts_data;
因为设置了一个小时,相关文章的数据就失效,这里一般就无需更新缓存了,如果你在后台更改了设置,需要立即清理缓存,可以使用 wp_cache_delete 进行清理:
wp_cacache_delete($post->ID,'related_posts');
WPJAM Basic 插件已经集成了 Memcached,下载 WPJAM Basic 之后,将 wpjam-basic/template/ 目录下的 object-cache.php 文件复制到 wp-content 目录下即可。
以上就是WordPress 对象缓存(Object Cache)详细介绍和使用的详细内容,更多请关注php中文网其它相关文章!
--no-cache Vs的Alpine Dockerfile的优势。rm / var / cache / apk / *
使用Alpine映像创建Dockerfile时,我经常看到apk --no-cache
提交时使用和的用法,而是看到rm/var/cache/apk/*
。
我很好奇,知道利用--no-cache
消除了以后再做的必要rm /var/cache/apk/*
。我还想知道一种风格是否胜过另一种。
答案1
小编典典该--no-cache
选项允许不在本地缓存索引,这对于保持容器较小非常有用。
从字面上看,它apk update
在开头和rm -rf /var/cache/apk/*
结尾相等。
我们使用--no-cache
option的一些示例:
$ docker run -ti alpine:3.7/ # apk add nginxWARNING: Ignoring APKINDEX.70c88391.tar.gz: No such file or directoryWARNING: Ignoring APKINDEX.5022a8a2.tar.gz: No such file or directoryERROR: unsatisfiable constraints: nginx (missing): required by: world[nginx]/ # / # apk add --no-cache nginxfetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gzfetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz(1/2) Installing pcre (8.41-r1)(2/2) Installing nginx (1.12.2-r3)Executing nginx-1.12.2-r3.pre-installExecuting busybox-1.27.2-r7.triggerOK: 6 MiB in 13 packages/ # / # ls -la /var/cache/apk/total 8drwxr-xr-x 2 root root 4096 Jan 9 19:37 .drwxr-xr-x 5 root root 4096 Mar 5 20:29 ..
另一个不使用--no-cache
选项的示例:
$ docker run -ti alpine:3.7/ # apk add nginxWARNING: Ignoring APKINDEX.70c88391.tar.gz: No such file or directoryWARNING: Ignoring APKINDEX.5022a8a2.tar.gz: No such file or directoryERROR: unsatisfiable constraints: nginx (missing): required by: world[nginx]/ # / # apk updatefetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gzfetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gzv3.7.0-107-g15dd6b8ab3 [http://dl-cdn.alpinelinux.org/alpine/v3.7/main]v3.7.0-105-g4b8b158c40 [http://dl-cdn.alpinelinux.org/alpine/v3.7/community]OK: 9048 distinct packages available/ # / # apk add nginx(1/2) Installing pcre (8.41-r1)(2/2) Installing nginx (1.12.2-r3)Executing nginx-1.12.2-r3.pre-installExecuting busybox-1.27.2-r7.triggerOK: 6 MiB in 13 packages/ # / # ls -la /var/cache/apk/total 1204drwxr-xr-x 2 root root 4096 Mar 5 20:31 .drwxr-xr-x 6 root root 4096 Mar 5 20:31 ..-rw-r--r-- 1 root root 451508 Mar 3 00:30 APKINDEX.5022a8a2.tar.gz-rw-r--r-- 1 root root 768680 Mar 5 09:39 APKINDEX.70c88391.tar.gz/ # / # rm -vrf /var/cache/apk/*removed ''/var/cache/apk/APKINDEX.5022a8a2.tar.gz''removed ''/var/cache/apk/APKINDEX.70c88391.tar.gz''
如您所见,这两种情况都是有效的。对我来说,使用--no-cache
option更为优雅。
.net – 新{object} vs {object} = new {object}
所以是:
Dim _StreamReader as New Streamreader(mystream)
与…不同
Dim _StreamReader as Streamreader = new streamreader(mystream)
引擎盖下有什么不同吗?还是他们都一样?你更喜欢哪一个?
在VB6中,它们的语义实际上是不同的(除了VB6不允许在声明中赋值的明显事实):As New变体将创建一个永远不会是nothing的对象.相反,运行时将确保在每次访问对象之前始终正确初始化对象.
angular – 无法解析AuthenticationService的所有参数:([object Object],?,[object Object])
Can’t resolve all parameters for AuthenticationService: ([object Object],?,[object Object])
我已经检查了几乎每个主题,并尝试了多种方法来解决它,但仍然无法在第二天击败它.
我试图像这样在appService中注入第一个authService但是得到了同样的错误
@Inject(forwardRef(() => AuthenticationService)) public authService: AuthenticationService
我检查了所有DI和服务内部的导入顺序,在我看来一切都是正确的
如果有人可以帮我处理它,我很感激.
Angular 4.0.0
AuthService
import { Injectable } from '@angular/core'; import {Http,Headers,Response} from '@angular/http'; import 'rxjs/add/operator/toPromise'; import {Observable} from 'rxjs/Rx'; import {AppServices} from "../../app.services"; import {Router} from "@angular/router"; @Injectable() export class AuthenticationService { public token: any; constructor( private http: Http,private appService: AppServices,private router: Router ) { this.token = localStorage.getItem('token'); } login(username: string,password: string): Observable<boolean> { let headers = new Headers(); let body = null; headers.append("Authorization",("Basic " + btoa(username + ':' + password))); return this.http.post(this.appService.api + '/login',body,{headers: headers}) .map((response: Response) => { let token = response.json() && response.json().token; if (token) { this.token = token; localStorage.setItem('Conform_token',token); return true; } else { return false; } }); } logout(): void { this.token = null; localStorage.removeItem('Conform_token'); this.router.navigate(['/login']); } }
应用服务
import {Injectable} from '@angular/core'; import {Headers,Http,RequestOptions} from '@angular/http'; import {Router} from "@angular/router"; import {AuthenticationService} from "./auth/auth.service"; import 'rxjs/add/operator/toPromise'; import {Observable} from 'rxjs/Rx'; @Injectable() export class AppServices { api = '//endpoint/'; public options: any; constructor( private http: Http,private router: Router,public authService: AuthenticationService // doesn't work // @Inject(forwardRef(() => AuthenticationService)) public authService: AuthenticationService // doesn't work either ) { let head = new Headers({ 'Authorization': 'Bearer ' + this.authService.token,"Content-Type": "application/json; charset=utf8" }); this.options = new RequestOptions({headers: head}); } // ==================== // data services // ==================== getData(): Promise<any> { return this.http .get(this.api + "/data",this.options) .toPromise() .then(response => response.json() as Array<Object>) .catch((err)=>{this.handleError(err);}) }
应用模块
import { browserModule } from '@angular/platform-browser'; import { browserAnimationsModule } from '@angular/platform-browser/animations'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import {BaseRequestOptions,HttpModule} from '@angular/http'; import { MaterialModule} from '@angular/material'; import {FlexLayoutModule} from "@angular/flex-layout"; import 'hammerjs'; import { routing,appRoutingProviders } from './app.routing'; import { AppServices } from './app.services'; import {AuthGuard} from "./auth/auth.guard"; import {AuthenticationService} from "./auth/auth.service"; import {AppComponent} from './app.component'; import {AuthComponent} from './auth/auth.component'; import {NotFoundComponent} from './404/not-found.component'; import { HomeComponent } from './home/home.component'; @NgModule({ declarations: [ AppComponent,AuthComponent,NotFoundComponent,HomeComponent ],imports: [ browserModule,browserAnimationsModule,FormsModule,HttpModule,routing,MaterialModule,FlexLayoutModule ],providers: [AppServices,AuthGuard,AuthenticationService],bootstrap: [AppComponent] }) export class AppModule { }
解决方法
你可以使用
export class AuthenticationService { public token: any; appService: AppServices; constructor( private http: Http,// private appService: AppServices,injector:Injector; private router: Router ) { setTimeout(() => this.appService = injector.get(AppServices)); this.token = localStorage.getItem('token'); }
另见DI with cyclic dependency with custom HTTP and ConfigService
要避免使用setTimeout,您还可以从AppService的构造函数中设置AuthenticationService.appService(或者相反)
ASP.NET list
public partial class 测试 : System.Web.UI.Page
{
static List<Item> allAnswer= new List<Item>();
protected void Page_Load(object sender, EventArgs e)
{
//首次加载
if (IsPostBack == false)
{
//不能使用将allAnswer中的元素全部删除,这样也会将session中的值清空
//allAnswer.clean();
//使用重新定义新的空的对象来实现对allAnswer的清空
allAnswer = new List<Item>();
List<Item> reallAnswer = null;
try
{
//其中Session["ReAllAnswer"]来自于另一页面
reallAnswer = (List<Item>)Session["ReAllAnswer"];
//PrintAllAnwser(reallAnswer);
}
catch { }
}
}
如果使用allAnswer.clean()函数,则接收的数据Session["ReAllAnswer"]将会设置为空;
而使用new List<Item>(),则不会。
我们今天的关于WordPress 对象缓存和Object Cache详细介绍和使用的分享就到这里,谢谢您的阅读,如果想了解更多关于--no-cache Vs的Alpine Dockerfile的优势。rm / var / cache / apk / *、.net – 新{object} vs {object} = new {object}、angular – 无法解析AuthenticationService的所有参数:([object Object],?,[object Object])、ASP.NET list的相关信息,可以在本站进行搜索。
本文标签: