<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alt om ingenting og litt i mellom &#187; WordPress</title>
	<atom:link href="http://hovenko.no/blog/tag/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>https://hovenko.no/blog</link>
	<description>En blogg av Knut-Olav</description>
	<lastBuildDate>Mon, 10 Mar 2025 19:25:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>How to not tell about a security breach?</title>
		<link>https://hovenko.no/blog/2009/09/07/how-to-not-tell-about-a-security-breach/</link>
		<comments>https://hovenko.no/blog/2009/09/07/how-to-not-tell-about-a-security-breach/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 12:59:55 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[English-posts]]></category>
		<category><![CDATA[Klagemuren]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=346</guid>
		<description><![CDATA[WordPress is breached, again. I guess I run an unsecure version of WordPress, but I&#8217;m not sure. All I am told is that i don&#8217;t runt he latest version of WordPress and that I should upgrade, because upgrading is easy. No, it&#8217;s not easy. I keep history of my webpage in Subversion, so every time [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress is breached, again. I guess I run an unsecure version of WordPress, but I&#8217;m not sure. All I am told is that i don&#8217;t runt he latest version of WordPress and <a href="http://wordpress.org/development/2009/09/keep-wordpress-secure/">that I should upgrade, because upgrading is easy</a>.</p>
<p>No, it&#8217;s not easy. I keep history of my webpage in Subversion, so every time I need to upgrade WordPress I need to add the new version into Subversion in the vendor branch, merge in the changes in a WordPress current branch and then merge the changes into trunk of my web page. Why I do this, you say? No software is perfect, WordPress is far from it, so I need to alter some core code from time to time. That&#8217;s why.</p>
<p>Ok, back to the topic. Matt Mullenweg does not tell me in his blog post (link above) anything about what versions of WordPress that are potential targets for this Internet worm that exploits this security breach, nor what part of the code that makes it possible, not even how to patch it up. The entire blog post is just explaining that security holes do happen and some theory about how to protect yourself from it. Nothing concrete. Not very useful.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2009/09/07/how-to-not-tell-about-a-security-breach/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Finally someone criticizing WordPress for what it is&#8230;</title>
		<link>https://hovenko.no/blog/2009/08/18/finally-someone-criticizing-wordpress-for-what-it-is/</link>
		<comments>https://hovenko.no/blog/2009/08/18/finally-someone-criticizing-wordpress-for-what-it-is/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 16:28:50 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[English-posts]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=340</guid>
		<description><![CDATA[WordPress is slow. Really slow. It is bad coded, I know because I have done a lot of plugin development and even more debugging of the WordPress core code. The blog entry 5 Essential Tips for Overcoming WordPress 2.8 Performance Problems describes some severe issues that WordPress blogs has, especially regarding bad performance. In short: [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress is slow. Really slow. It is bad coded, I know because I have done a lot of plugin development and even more debugging of the WordPress core code.</p>
<p>The blog entry <a href="http://counsellingresource.com/features/2009/08/15/5-essential-tips-for-wordpress-performance/">5 Essential Tips for Overcoming WordPress 2.8 Performance Problems</a> describes some severe issues that WordPress blogs has, especially regarding bad performance.</p>
<p>In short: &#8220;Deal With It.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2009/08/18/finally-someone-criticizing-wordpress-for-what-it-is/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress plugins &#8211; katalogstruktur</title>
		<link>https://hovenko.no/blog/2007/06/07/wordpress-plugins-katalogstruktur/</link>
		<comments>https://hovenko.no/blog/2007/06/07/wordpress-plugins-katalogstruktur/#comments</comments>
		<pubDate>Wed, 06 Jun 2007 22:54:43 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[katalogstruktur]]></category>
		<category><![CDATA[kontroller]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ytelse]]></category>

		<guid isPermaLink="false">http://www.hoven.ws/blog/2007/06/07/wordpress-plugins-katalogstruktur/</guid>
		<description><![CDATA[Når man utvikler en plugin for WordPress som stadig utvides med ny funksjonalitet kan den vokse så stor at det kan bli et uhåndterbart antall filer i pluginkatalogen eller at filene rett og slett blir så store at det er vanskelig å få oversikt over funksjonaliteten i filene. Dette går også ut over ytelsen til [...]]]></description>
			<content:encoded><![CDATA[<p>Når man utvikler en <a href="http://codex.wordpress.org/Writing_a_Plugin">plugin</a> for <a href="http://www.wordpress.org">WordPress</a> som stadig utvides med ny funksjonalitet kan den vokse så stor at det kan bli et uhåndterbart antall filer i pluginkatalogen eller at filene rett og slett blir så store at det er vanskelig å få oversikt over funksjonaliteten i filene. Dette går også ut over ytelsen til WordPress. Et eksempel er plugin-siden i administrasjonsgrensesnittet som søker i alle PHP-filer i alle underkataloger ett nivå under plugins-katalogen etter filer med en <a href="http://codex.wordpress.org/Writing_a_Plugin#File_Headers">plugin-header</a>.</p>
<p>Dersom man kun beholder én PHP-fil, som vi kaller for &#8220;loader&#8221;, i rotkatalogen til pluginen kan ytelsen økes noe. Denne filen inneholer plugin-headeren og den eneste oppgaven til denne filen er å laste de resterende filene i pluginen. Denne loaderen vil videre laste en kontroller i en katalog vi kan kalle for &#8220;core&#8221;. Denne kontrolleren har som oppgave å sette opp hooks for å intregere mot WordPress og ellers kontrollere dataflyten i pluginen.</p>
<p>Den viktigste grunnen for å organisere filene sine er for å få bedre oversikt. En måte å gjøre dette på er å benytte underkataloger basert på funksjonalitet og filtype. For eksempel kan man plassere alle Javascript-filer i en &#8220;js&#8221;-katalog og alle CSS-filer i en &#8220;css&#8221;-katalog. Dersom pluginen din skal ha et administrasjonsgrensesnitt kan disse filene legges i katalogen &#8220;admin&#8221;, og en widget-støttet plugin kan ha widget-relaterte filer i en &#8220;widget&#8221;-katalog. All denne strukturen krever litt ekstra koding og flere filer å holde styr på, men til gjengjeld slipper man å se sine filer vokse til store monstere på flere tusen linjer. Store filer kan lett bli et problem, noe jeg selv har erfart i utvikling av WordPress-plugins.</p>
<p>Eksempel på katalogstruktur for en plugin av passe stor størrelse:<br />
<code><br />
my_plugin_loader.php<br />
/actions/controller.php<br />
/actions/widget.ajax.php<br />
/admin/options.php<br />
/core/my_plugin.php<br />
/css/admin.options.css<br />
/css/widget-css.php<br />
/js/script-loader.php<br />
/js/some_lib.js<br />
/js/widget-js.php<br />
/languages/my_plugin-nb_NO.po<br />
/languages/my_plugin-nb_NO.mo<br />
/widget/widget.control.php<br />
/widget/widget.php<br />
</code></p>
<p>Jeg har her brukt noen passende filnavn. Det er ofte ikke nødvendig å spesifisere katalognavnet som en del av filnavnet, men av og til kan det være smart, avhengig av hvilken editor som benyttes. Selv benytter jeg Eclipse som viser kun filnavnet, og det kan være vanskelig å skille tre åpne filer som alle heter &#8220;control.php&#8221; fra hverandre.</p>
<p>Jeg har tatt med i eksempelet en fil som heter &#8220;script-loader.php&#8221; som kan benyttes for å laste Javascript-filene. WordPress har funksjonalitet for å registrere Javascriptene med navn, URL og avhengigheter. Det er også mulig å spesifisere versjon av Javascriptet, som blir en del av URL-adressen til filen. Dette er svært aktuelt for å tvinge nettlesere til å laste den nye Javascript-filen fremfor å benytte en som kan finnes i en cache ett eller annet sted.</p>
<p>Man kan ha behov for å kalle på funksjonalitet i pluginen som ikke skal benytte det vanlige themet til WordPress, men kanskje bare returnere noe data til et Javascript, utføre en oppdatering eller printe ut en CSS- eller Javascript-fil. Man kan dermed ha behov for en egen <a href="http://www.hoven.ws/blog/2007/03/08/wordpress-plugins-front-controller/">front-kontroller</a> som tar seg av disse forespørslene.</p>
<p>Jeg benytter PHP5 og objektorientering for å utvikle plugins til WordPress, men tankene og forslagene i denne artikkelen kan like gjerne benyttes med en strukturell programmeringsmetodikk. Jeg synes det er alt for mange dårlig skrevne plugins for WordPress, hacket sammen for å gi funksjonaliteten som er ønsket på det gitte tidspunktet. Dette gjør det vanskeligere å vedlikeholde dem senere når nye krav kommer og det gjør integrasjon med andre plugins og nyere versjoner av WordPress til et mareritt. Disse pluginene benyttes så som et utgangspunkt for nye plugins ved hjelp av copy/paste-metoden. Jeg tror at bedre dokumentasjon med gode eksempler kan bidra til bedre kodestandard på plugins.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2007/06/07/wordpress-plugins-katalogstruktur/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordPress plugins &#8211; Front Controller</title>
		<link>https://hovenko.no/blog/2007/03/08/wordpress-plugins-front-controller/</link>
		<comments>https://hovenko.no/blog/2007/03/08/wordpress-plugins-front-controller/#comments</comments>
		<pubDate>Thu, 08 Mar 2007 21:05:05 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Jobb]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[pattern]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">/blog/2007/03/08/wordpress-plugins-front-controller/</guid>
		<description><![CDATA[WordPress støtter utvidelser via plugins. Plugins kommuniserer med WordPress-kjernen ved å hekte seg på kroker (hooks). Disse krokene blir eksekvert visse steder i koden, for eksempel når en side med poster skal vises, når en bruker opprettes eller når en post slettes. Det er en handlingskrok (action hook) som heter &#8220;init&#8221; som blir kalt på [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.wordpress.org">WordPress</a> støtter utvidelser via plugins. Plugins kommuniserer med WordPress-kjernen ved å hekte seg på kroker (hooks). Disse krokene blir eksekvert visse steder i koden, for eksempel når en side med poster skal vises,  når en bruker opprettes eller når en post slettes.</p>
<p>Det er en handlingskrok (action hook) som heter &#8220;init&#8221; som blir kalt på rett før themet skal lastes inn for presentasjon av postene. Når denne kroken skal eksekveres er plugins lastet og innstillinger lest fra databasen, så denne kroken egner seg svært godt for det jeg nå skal vise, nemlig hvordan man kan kalle på funksjoner i sin egen plugin med via lenker på siden, med HTML forms eller via Javascript og AJAX.</p>
<p>Jeg har ofte hatt behov for å kalle på funksjoner i min plugin fra Javascript på siden, også kjent som Ajax/Web2.0. Jeg har utviklet en plugin som lar brukeren sette et filter, slik at kun innlegg som matcher dette filteret vil bli vist. Jeg skrev denne pluginen på jobben og den er foreløpig kun for internt bruk og er derfor ikke tilgjengelig, men det hindrer meg ikke i å forklare hvordan jeg har brukt denne teknikken.</p>
<p>Dette filteret settes i cookie i nettleseren til brukeren slik at filteret er aktivt helt til brukeren bytter til et annet filter. Filtere kan ligge i nivåer underhverandre. Tenk på det som kategoriene i WordPress, hvor kategorier kan ha en forelderkategori. Jeg skal her vise to eksempler hvor jeg først bruker en link for å bytte til et annet filter, for så å vise hvordan jeg bruker AJAX for å hente en liste med filter.</p>
<p>Linken for å bytte filter kan for eksempel se slik ut:<br />
<code><br />
&lt;a href="http://example.com/?myplugin=set&#038;filter=sport"&gt;Sport&lt;/a&gt;<br />
</code></p>
<p>Da har jeg behov for en sjekk i min plugin, som jeg har valgt å kalle &#8220;myplugin&#8221; (ja, jeg vet, men dette er ikke navnet på min ekte plugin <img src='https://hovenko.no/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ), for å kunne snappe opp ønsket om å bytte filteret til &#8220;sport&#8221;. Jeg har valgt kodeordet &#8220;myplugin&#8221;, det samme som navnet på pluginen jeg har skrevet for å minke risikoen for navnekollisjon. Jeg har en funksjon jeg har hengt på &#8220;init&#8221;-kroken som sjekker om kodeordet er blitt angitt i adressen samt om det finnes en passende handling å utføre.</p>
<p>I eksempelet nedenfor viser jeg også PHP-kode som tar i mot ønsket om å liste ut alle filtere som har et angitt filter som forelder. Legg merke til dersom testen matcher &#8216;list&#8217; vil den printe ut listen for så å dø, hardt og brutalt. Dette er faktisk ønskelig fordi vi skal utføre et asynkront kall med Javascript, noe som betyr at nettsiden ikke skal lastes på nytt, men bare en liten del av nettsiden skal oppdateres. Det som PHP-scriptet skriver ut i eksempelet nedenfor blir hentet opp av Javascriptet som utførte kallet, klar til å inkluderes på nettsiden. Om det er en &lt;select&gt;-liste, en rekke med checkboxer eller noe annet som gjøres med denne listen bestemmes av Javascriptet.</p>
<pre>
<code>
$myplugin = new MyPlugin();
add_action('init', array(&#038;$myplugin, 'check_action'));
//
// Hovedklassen i min plugin
class MyPlugin {
    function check_action() {
        $action = _REQUEST['myplugin'];
        switch($action) {
            case 'set':
                $this->set_filter($_REQUEST['filter']);
                break;
            case 'list':
                $list = $this->get_list($_REQUEST['parent']);
                echo $list;
                exit;
        }
    }
    // Setter nytt filter
    function set_filter($filter = '') {
        // Setter en cookie for brukerens nettleser
    }
    // Returnerer en liste med filtere som har en angitt forelder
    function get_list($parent = '') {
        // finner og returnerer listen med angitt forelder
    }
}
</code>
</pre>
<p>Hvordan Javascriptet som utfører dette asynkrone kallet er programmert skal jeg ikke komme inn på her. Det er et for stort tema å skrive om i denne artikkelen, men det finnes gode ressurser på Internett om AJAX, <a href="http://www.google.com">Google</a> vet det meste. Det kan være verdt å sjekke ut <a href="http://www.scss.com.au/family/andrew/webdesign/xmlhttprequest/">Cross-Browser XMLHttpRequest</a>, som gjør det enklere å bruke Ajax uten at man vrir seg i smerte over de mange forskjellige teknikkene som er brukt i nettlesere.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2007/03/08/wordpress-plugins-front-controller/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Konvertere mellom store og små bokstaver i PHP med mb_convert_case / strtolower</title>
		<link>https://hovenko.no/blog/2007/03/07/konvertere-mellom-store-og-sma-bokstaver-i-php-med-mb_convert_case-strtolower/</link>
		<comments>https://hovenko.no/blog/2007/03/07/konvertere-mellom-store-og-sma-bokstaver-i-php-med-mb_convert_case-strtolower/#comments</comments>
		<pubDate>Wed, 07 Mar 2007 21:45:52 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[konvertering]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[tegnsett]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[UTF-8]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">/blog/2007/03/07/konvertere-mellom-store-og-sma-bokstaver-i-php-med-mb_convert_case-strtolower/</guid>
		<description><![CDATA[Jeg følger opp gårsdagens innlegg med et nytt PHP-tips, denne gangen for å konvertere mellom store og små bokstaver. Til dette kan funksjonen mb_convert_case benyttes. Dersom man utvikler nettsider som skal ha støtte for flere språk er det vanskelig å komme utenom UTF-8, unicode. Ofte vil man teste på en variabel om den matcher et [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg følger opp <a href="/blog/2007/03/07/eaccelerator-en-php-akselerator/">gårsdagens innlegg</a> med et nytt PHP-tips, denne gangen for å konvertere mellom store og små bokstaver. Til dette kan funksjonen <a href="http://www.php.net/mb_convert_case"><em>mb_convert_case</em></a> benyttes.</p>
<p>Dersom man utvikler nettsider som skal ha støtte for flere språk er det vanskelig å komme utenom UTF-8, unicode. Ofte vil man teste på en variabel om den matcher et sett med konstanter eller andre variable som brukere skriver inn. Brukere er generelt sett svært ustabile når det gjelder hva input som kan komme inn til serveren, spesielt når det gjelder bruk av store og små bokstaver.</p>
<p>Et eksempel på dette er tagger i WordPress. Hvorfor skal man måtte ha to separate tagger som betyr det samme bare fordi den ene ble skrevet med stor forbokstav mens den andre med liten? Her kan det være kjekt å bruke PHP-funksjonen strtolower, helt til man kommer til spesielle bokstaver og tegn som ikke finnes i tegnsettet man normalt bruker, ofte ISO-8859-1 av en variant. Dette kan fungere greit dersom teksten som kommer inn er i samme tegnsett som serveren benytter, men når det gjelder unicode så er saken annerledes.</p>
<p>Strenger eier ingen informasjon om hvilket tegnsett som benyttes, dette må utviklere holde orden på. Funksjonen strtolower takler unicode svært dårlig. Spesielle tegn, som de norske bokstavene <em>æøåÆØÅ</em>, kodes i unicode med lengden av to vanlige bokstaver. Dette fører til at strtolower deler disse tegnene i to før den utfører konverteringen. Resultatet av dette blir mest sannsynlig et uventet tegn som nettleseren har problemet med å vise. Selv har jeg sett <em>?</em>-tegnet ganske ofte <img src='https://hovenko.no/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Løsningen rundt dette problemet er å benytte PHP-funksjonen <em>mb_convert_case</em>. Som vist i eksempelet konverteres tekststrengen til små bokstaver, lowercase:</p>
<p><code><br />
// UTF-8 tekststreng<br />
$orig_string = 'Hei på deg. Hvordan er været i Østfold?';<br />
$new_lower = mb_convert_case($orig_string, MB_CASE_LOWER, 'UTF-8');<br />
echo $new_lower;<br />
</code></p>
<p>Funksjonen echo vil her skrive ut: <em>hei på deg. hvordan er været i østfold?</em></p>
<p>Den første parameteren til mb_convert_case er tekststrengen som skal konverteres, mens den andre angir hvilken type konvertering som skal utføres, i form av en konstant. Følgende konstanter kan gis til mb_convert_case:</p>
<ul>
<li>MB_CASE_LOWER: konvertere til små bokstaver</li>
<li>MB_CASE_UPPER: konvertere til store bokstaver</li>
<li>MB_CASE_TITLE: konvertere til stor forbokstav i hvert ord</li>
</ul>
<p>Funksjonen mb_convert_case tar også en parameter som forteller hvilket tegnsett som ønskes brukt ved konvertering. På noen forum og mailinglister foreslås det at man kan bruke funksjonen <em>setlocale</em> før strtolower for å sette hvilket tegnsett som skal benyttes, men dette hjalp ikke i mitt tilfelle. Funksjonen mb_convert_case tar utgangspunkt i at tekststrengen er i unicode og klarer derfor å konvertere norske spesialtegn på en utmerket måte.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2007/03/07/konvertere-mellom-store-og-sma-bokstaver-i-php-med-mb_convert_case-strtolower/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>eAccelerator &#8211; en PHP-akselerator</title>
		<link>https://hovenko.no/blog/2007/03/07/eaccelerator-en-php-akselerator/</link>
		<comments>https://hovenko.no/blog/2007/03/07/eaccelerator-en-php-akselerator/#comments</comments>
		<pubDate>Tue, 06 Mar 2007 23:04:04 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Jobb]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[akselerator]]></category>
		<category><![CDATA[eAccelerator]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">/blog/2007/03/07/eaccelerator-en-php-akselerator/</guid>
		<description><![CDATA[Jeg har utviklet en nettside, basert på WordPress, hvor vi hadde et problem med at den brukte alt for lang tid på å levere sidene til brukere, selv med bare 10-15 samtidige brukere. Problemet lå på Apache, som fikk serverloaden opp i omkring 7-8. Oppslag av hostnames i Apache var skrudd av og loggfilene var [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg har utviklet en nettside, basert på <a href="http://www.wordpress.org">WordPress</a>, hvor vi hadde et problem med at den brukte alt for lang tid på å levere sidene til brukere, selv med bare 10-15 samtidige brukere. Problemet lå på Apache, som fikk serverloaden opp i omkring 7-8. Oppslag av hostnames i Apache var skrudd av og loggfilene var satt til å roteres hver dag for å forhindre alt for store filer. Siden PHP kjøres gjennom mod_php var dette neste stedet å undersøke. WordPress med et utallig antall plugins resulterer i svært mange PHP-filer som må lastes for hver eneste gang en nettside hentes. Selv et lite Javascript kan kreve mye ressurser dersom dette scriptet har behov for selv bare én enkelt variabel fra databasen. En caching-løsning som cacher HTML-sidene basert på URL og cookies, ala WP-Cache, var ikke noen god løsning, fordi sidene som vises for innloggede brukere ikke bare bestemmes av URL og cookies, men også av variabler hentet fra en database. Memcache ble benyttet for å cache variabler fra databasen for å minke antallet spørringer mot denne, men det hjalp ikke i lengden.</p>
<p>Løsningen på ytelsesproblemet kom med <a href="http://eaccelerator.net/">eAccelerator</a>, en cache-løsning for PHP som cacher de kompilerte PHP-filene, slik at PHP ikke behøver å lese og kompilere alle PHP-filene for hver sidelasting. Andre nettbaserte løsninger som for eksempel benytter Java EE (Enterprise Edition) har en server som hele tiden kjører selv om ingen brukere besøker siden. Fordelen med dette er at alle filer med tilhørende klasser og andre ressurser allerede er lastet inn i minnet på serveren, noe som sparer diskaktivitet og prosessorkraft når brukere besøker siden din.</p>
<p>I dette prosjektet ble versjon 0.9.5 av eAccelerator benyttet. Uten å kjøre nøyaktige benchmarktester så virket denne løsningen betraktelig raskere; sidene lastet raskere i nettleserene og serverloaden er blitt gjennomsnittlig lavere.</p>
<p>eAccelerator finnes ikke i pakkesystemene til Ubuntu eller FreeBSD, så denne må manuelt lastes ned og kompileres. Man trenger dev-pakkene for PHP for å kompilere eAccelerator, da man trenger verktøyet phpize. Dev-pakken på Ubuntu heter php5-dev, eller php4-dev dersom denne versjonen benyttes.<br />
<code><br />
phpize<br />
./configure --enable-eaccelerator \<br />
    --with-php-config=/usr/bin/php-config<br />
make &#038;&#038; make install<br />
</code></p>
<p>Deretter må den aktuelle php.ini-filen som Apache benytter seg av for mod_php oppdateres med følgende innstillinger. Bemerk at kun første linjen er påkrevd. Standard katalog for cache-filene er /tmp/eaccelerator, så denne må opprettes og det må gis skriverettigheter til brukeren som Apache kjører som. På distribusjoner hvor /tmp katalogen slettes ved booting av operativsystemet bør cache_dir settes til en annen katalog, for eksempel /var/cache/eaccelerator. Verdiene i eksempelet nedenfor er hentet fra <a href="http://eaccelerator.net/wiki/InstallFromSource">eAccelerator &#8211; Installing from source</a>.<br />
<code><br />
extension="eaccelerator.so"<br />
eaccelerator.shm_size="16"<br />
eaccelerator.cache_dir="/tmp/eaccelerator"<br />
eaccelerator.enable="1"<br />
eaccelerator.optimizer="1"<br />
eaccelerator.check_mtime="1"<br />
eaccelerator.debug="0"<br />
eaccelerator.filter=""<br />
eaccelerator.shm_max="0"<br />
eaccelerator.shm_ttl="0"<br />
eaccelerator.shm_prune_period="0"<br />
eaccelerator.shm_only="0"<br />
eaccelerator.compress="1"<br />
eaccelerator.compress_level="9"<br />
</code></p>
<p>WordPress har et litt rufsete rykte, blant annet på grunn av at en WordPress-side ikke tåler trykket dersom en artikkel skrevet i en WordPress-blogg havner på forsiden av for eksempel <a href="http://www.digg.com">Digg</a>. Muligens kan en slik cache-løsning være redningen for WordPress, og forsåvidt andre PHP-applikasjoner.</p>
<p><em>Oppdatering 07.03.2007 08:38 CET</em><br />
Et problem med eAccelerator er at instansvariabler deklarert med protected vil få eAccelerator til å krasje dersom en klasse som arver på denne forsøker å aksessere disse protected variablene. Løsningen på dette er å deklarere dem som public. Ikke spesielt god designmetodikk, men det fungerer&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2007/03/07/eaccelerator-en-php-akselerator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Nytt theme</title>
		<link>https://hovenko.no/blog/2007/01/21/nytt-theme/</link>
		<comments>https://hovenko.no/blog/2007/01/21/nytt-theme/#comments</comments>
		<pubDate>Sun, 21 Jan 2007 13:01:00 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Navigator]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">/v2/2007/01/21/nytt-theme/</guid>
		<description><![CDATA[Hei. Nå er det nytt år og nye muligheter, og nytt theme på hjemmesiden min. Standard-themet til WordPress begynte å bli noe kjedelig, så jeg tenkte det skulle bli interessant å teste ut noen andre themes. Jeg endte opp med å bruke themet Navigator 1.0. Personlig så synes jeg kanskje overskriftene på menyen til høyre [...]]]></description>
			<content:encoded><![CDATA[<p>Hei. Nå er det nytt år og nye muligheter, og nytt theme på hjemmesiden min. Standard-themet til WordPress begynte å bli noe kjedelig, så jeg tenkte det skulle bli interessant å teste ut noen andre themes. Jeg endte opp med å bruke themet <a href="http://themes.wordpress.net/columns/3-columns/1422/navigator-10/">Navigator 1.0</a>. Personlig så synes jeg kanskje overskriftene på menyen til høyre skiller seg unaturlig ut fra resten av siden, men jeg får endre på det hvis jeg får tid og gidder.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2007/01/21/nytt-theme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
