På min server kører jeg et par WordPress installationer, og bruger XCache til at speede tingene lidt op ved at cache de kompilerede PHP scripts, hvilket fungerer upåklageligt. XCache har dog også en funktionalitet hvor den kan cache ofte brugte data, så den sparer nogle databaseopslag, men denne funktionalitet kræver at WordPress understøtter den. Det gør WordPress sådan set også, i og med den tilbyder et API hvor man selv kan skrive sine egne cache plugins, der fx bruger XCache.
Sådan et XCache plugin til Wordress har NeoSmart lavet. Desværre virker det ikke helt efter hensigten, fx bliver visse data gemt for altid, hvilket bevirker at nogle sider aldrig ændrer sig, selvom det er meningen at de skal. Desværre ser det ikke ud til at NeoSmart har tænkt sig at gøre noget ved det. Det er jeg ikke den eneste der er træt af, så en fyr ved navn Dougal Campbell har rettet fejlene i NeoSmart’s plugin og publiseret disse rettelser.
Jeg har forsøgt at anvende sidstnævnte plugin, men der var en ting der ikke virkede. Når man loggede ind på administrationsdelen af WordPress, så fik man af og til en besked om at man ikke havde rettigheder til at se siden. Derfor opgav jeg at anvende dette plugin, indtil nu hvor jeg har fundet (og rettet) fejlen.
Problemet er, at jeg kører flere WordPress installationer på samme server, der alle deler samme cache. Når data gemmes i en cache, så gemmes det med en bestemt nøgle, så man senere kan slå op på den nøgle, og hente de data der ligger i cachen. WordPress har et bestemt navn til hver af disse nøgler, men når flere WordPress installationer deler den samme cache, så kommer de også til at tilgå hinandens data, da de slår op efter den samme nøgle i cachen. Det betyder at den første der prøver at logge på kan gøre det uden problemer, men herefter kan man ikke logge på de andre WordPress installationer, da de checker login op mod de (forkerte) cachede værdier.
Da jeg først indså dette, var det simpelt at fikse. I wp-config.php for hver WordPress installation definerer man en variabel $blog_id som man sætter til noget unikt for hver blog, fx bloggens adresse. Derefter kræver det blot en sølle ændring i object-cache.php: I funktionen key($key, $group) skal man erstatte linjen $prefix = ”; med $prefix = $blog_id;. Dette sætter et unikt (for hver blog) præfix på disse nøgler, så der nu ikke kan være overlap mellem dem.
Alle WordPress blogs på denne server kører nu med XCache, hvilket giver et lille performance boost. På nogle blogs er dette dog mere mærkbart end andre.