<?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>Från skog till web &#187; mysql</title>
	<atom:link href="http://txc.se/tag/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://txc.se</link>
	<description>Om att se livet från olika sidor</description>
	<lastBuildDate>Sat, 19 Jun 2010 21:49:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Utöka PHPs sessions hantering</title>
		<link>http://txc.se/2009/04/utoka-phps-sessions-hantering/</link>
		<comments>http://txc.se/2009/04/utoka-phps-sessions-hantering/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 23:50:22 +0000</pubDate>
		<dc:creator>TXC</dc:creator>
				<category><![CDATA[Webben]]></category>
		<category><![CDATA[memcache]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.txc.se/?p=22</guid>
		<description><![CDATA[I PHP, sessioner kan hålla ordning på autensierade användare. Det är väsentlig byggsten i dagens gigantiska communities och aktiviteter online. Utan sessioner så skulle alla bara vara en anonym användare. I &#8221;dataspråk&#8221; så skulle PHPs sessioner enbart vara små filer, sparade på serverns disk. Men på vältrafikerade servers så är det mycket disk I/O inblandat, [...]]]></description>
			<content:encoded><![CDATA[<p>I PHP, sessioner kan hålla ordning på autensierade användare. Det är väsentlig byggsten i dagens gigantiska communities och aktiviteter online. Utan sessioner så skulle alla bara vara en anonym användare.<br />
I &#8221;dataspråk&#8221; så skulle PHPs sessioner enbart vara små filer, sparade på serverns disk. Men på vältrafikerade servers så är det mycket <abbr title="Disk Input/Output">disk I/O</abbr> inblandat, och att inte kunna dela med sig av denna information med andra/flera webbservers från grunden gör detta långt från idealiskt.</p>
<p>Skall visa ett sätt att göra detta i PHP och tillsammans med <a title="memcached: a distributed memory object caching system" href="http://www.danga.com/memcached/">memcached</a><br />
<span id="more-22"></span></p>
<h2>Sessions delning i Webbkluster</h2>
<p>Om du har flera webbserver som alla har hand om samma webbsida, sessioner borde bli delade mellan dessa servers, och inte sparas på varje servers disk. För när en användare blir lastbalanserad till en annan server, så kan inte sessionen hittas, vilket kommer att resultera i att användaren blir utloggad.</p>
<p>En vanlig väg runt detta är att använda en anpassad sessions hanterare. Skriver en klass som tar över standard förfarandet och sparas sessionen i en MySQL databas</p>
<h2>Sessioner i en databas</h2>
<p>Alla webservrar ansluter till samma databas och såvidare, så snart <em>www01</em> registrerar en session ( insert i en sessions tabel), <em>www02</em> kan läsa den. Alla servrarna kan se alla sessioner. Problem löst?</p>
<p>Ja, och nej. Detta är funktionellt och det hanterar problemet med delbarheten. Men databaser är den största flaskhalsen för webbkluster idag. De är svåra att skala, och i miljöer där det förekommer hög trafik så vill man inte belasta dom i onödan. Sessioner i en databas löser bara 2/3 av problemet, vi måste lösa prestandan också.</p>
<h3>Databas minne</h3>
<p>Minne är cirka 30 gånger snabbare än disk utrymme. Så att spara våra sessioner i minnet skulle ge oss bra prestanda.</p>
<h4>MySQL query caching</h4>
<p>En form av att använda databas minne är det som är inbyggt i MySQL. MySQL query cache. Men MySQL query cache är inte så effektivt som man skulle vilja, kort och gott, det suger! När man skriver/uppdaterar en post i MySQL så töms cachen. Inte så effektivt som man skulle vilja.</p>
<p>Självklart så blir sessions tabellen ändrad hela tiden, vilket gör att cachen blir tömd hela tiden, vilket gör den värdelös får detta bruk.</p>
<h4>Heap tables / Memory tables</h4>
<p>Vi närmar oss verkligen vårt mål nu. Spara våra sessioner i en heap/memory table (en tabell som existerar i databas serverns RAM) snabbar verkligen upp saker ordentligt. Många krävande sidor har valt denna lösning.</p>
<p>Men i mina ögon, så är detta inte optimalt. För att detta kräver en massa extra frågor mot våran databas, något som den inte skall behöva.</p>
<p>En annan lösning är att använda Memcache. Och du kommer att finna denna lösning enkel och minimal. På grund av en sak, du behöver inte en anpassad lösning. Stödet för detta följer med PHP.</p>
<h2>Memcache</h2>
<p>Memcache är ett litet program som ursprungligen kommer från <a title="LiveJournal.com - Start a Free Blog / Journal Today" href="http://www.livejournal.com">Live Journal</a>. Det är ganska enkelt: Det reserverar lite minne, öppnar upp en socket och bara finns där.</p>
<p>Vi kan ansluta till socketen och spara variablar där, och hämta dom senare. Lagringen av variablarna sker i minnet. Så det är blixtsnabbt.</p>
<p>Memcache kan användas för en mängd saker, funktions resultat, hela html block, databas resultat. Men vi skall använda det för att spara vår användares sessioner.</p>
<h3>Uppbyggnad</h3>
<p>Från systemets sida, Memcache liknar mycket som MySQL. Du har en:</p>
<ul>
<li><strong>Server</strong><br />
Där informationen är lagrad. Bör köras hela tiden</li>
<li><strong>Klient</strong><br />
Interface för att spara &amp; hämta information från servern.<br />
Är integrerat i vårt programmerings språk</li>
</ul>
<p>Det är en viktig sak som skiljer. Om Memcache stängs av, så förloras all information. Så kom ihåg att bara använda Memcache som en cache och ingen lagringsenhet. Det finns ingen möjlighet att återskapa data, likt en hårddisk. För sessioner så är detta en risk jag är beredd att ta. Det värsta som kan hända är att användarna loggas ut. Om du inte kan leva med detta så bör du kombinera databas &amp; memcache sessions hanterare. Databas är en säker lösning, memcache kommer att vara front för dess prestanda. Om den kraschar, så kommer du bara att förlora prestandan, men inte datan.</p>
<h3>Installera en Memcache server</h3>
<p>För sessions delning, använd en central server. Om du bara har en webbserver, så gör det fortfarande nytta att använda Memcache för dess prestanda. Ändra bara så att dess maximala minnes storlek är begränsat till 64MB (beror på din server och önskemål), och använd localhost (127.0.0.1) för att ansluta till den.</p>
<p>Om du inte har Memcache redan, så kan du enkelt installera det via ditt paketsystem. Jag använder Debian så för mig är det:</p>
<pre>apt-get install memcached</pre>
<p>Ändra inställningarna i <em>/etc/memcached/memcached.conf</em>. I mitt fall så var grundinställningen OK. Jag ökade bara det maximala värdet för minnet och tillät fler att ansluta.</p>
<p>Starta nu om Memcache processen</p>
<pre>/etc/init.d/memcached restart</pre>
<p>(För mig startades processen automatiskt när jag installerade den. Därför jag har <em>restart</em> istället för <em>start</em>. Men skulle inte processen vara igång så fungerar <em>restart</em> lika bra.)</p>
<p>Nu är vi klara att använda Memcache. Men hur?</p>
<h3>Installera en Memcache klient</h3>
<p>Du kunde bara öppna upp en socket via telnet och &#8221;prata&#8221; direkt med Memcache, men det skulle troligen mest ge dig huvudvärk. Så det finns en standard PHP modul som vi kan använda och som gör majoriteten av jobbet åt oss, och som tillåter oss att prata objekt orienterat med den. Detta fungerar nästan precis som att installera en MySQL modul. Om din distribution har den, så bra då, kör bara:</p>
<pre>apt-get install php5-memcache</pre>
<p>Om inte, inga problem. Se bara till att du har pecl tillgängligt och:</p>
<pre>pear install pecl/memcache</pre>
<p>(Pecl har en bug som ger ett &#8221;Fatal error: Allowed memory size of XXXX bytes exhausted)</p>
<p>När du använder pecl som metod, var god välj:</p>
<pre>Enable memcache session handler support? [yes] : yes</pre>
<p>Du måste aktivera så att PHP kan använda modulen vi nu har, så lägg till:</p>
<pre>extension=memcache.so</pre>
<p>I Debian så finns det en katalog i <em>/etc/php5/</em> som heter <em>conf.d</em>, där ligger troligen alla dina moduler. Finns det inte en fil som heter något i stil med <em>memcache.ini</em> så skapa en med innehållet ovan.</p>
<p>Toppen, nu har vi alla förutsättningar för att börja använda Memcache.</p>
<h2>Sessioner i Memcache</h2>
<p>PHP tillåter dig att styra över hanteringen för sessioner på två sätt:</p>
<ol>
<li><a class="function" href="http://se2.php.net/manual/en/function.session-set-save-handler.php">session_set_save_handler()</a>. För att programmera dina egna sessions hanterare, tillåter dig virtuellt sätt att använda vilket lagringssätt du vill, så länge du kan läsa/skriva till det från PHP. <a href="http://se2.php.net/manual/en/function.session-set-save-handler.php#81761">Detta exempel</a> använder en MySQL databas. Vi kan också använda denna metod för att ansluta till Memcache.</li>
<li><a href="http://se2.php.net/manual/en/session.configuration.php#ini.session.save-handler">session.save_handler</a>. Genom att specificera en av standard hanterarna i php.ini genom att använda <a href="http://se2.php.net/manual/en/session.configuration.php#ini.session.save-handler">session.save_handler</a> &amp; session.save_path</li>
</ol>
<p>Val 1 ger dig större flexibilitet. Och ger dig även möjligheten att skapa en kombinerad lösning databas/memcache. Vilket resulterar i en fallback till databasen om något skulle hända med Memcache.</p>
<p>Val 2 är väldigt enkelt att göra, och kräver inte att man måste ändra sin kod, och det är det jag skall visa.</p>
<h3>session.save_handler</h3>
<p>Förutsätter att du redan har en webbserver, och installerat Memcache på samma maskin, hostnamnet kommer att vara 127.0.0.1. Om du har den på en annan server så vet du vad du skall ändra och vad det skall ändras till.</p>
<pre>session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"</pre>
<p>Klart! HUH? Vad hände precis?</p>
<p>Japp, vi har precis aktiverat Memcache sessions hantering stöd, och allt jobb är klart för oss. PHP kommer nu att veta att den inte skall använda standard <em>files</em> hanteringen i /tmp/ eller vart det nu är inställt att sparas, utan kommer att använda Memcache som körs på 127.0.0.1 istället.</p>
<p>Glöm inte bort att starta om din webserver för att verkställa dina ändringar i <em>php.ini</em></p>
<pre>/etc/init.d/apache2 restart</pre>
<h2>Haken</h2>
<p>Precis som med allting som verkar för coolt, så är det en hake: Låsning. PHPs standard metod för sessions hantering låser hela sessionen tills den är klar. Memcache är byggt för hastighet och som ett resultat av detta så stödjer det inte denna form av låsning. Detta kan leda till att när man använder frames eller AJAX. Ibland kan det ske att man frågar efter ett värde precis innan det har sparats.</p>
<h2>Mer läsning kring detta</h2>
<p>Det vi precis har gjort med Memcache är lätt fångad frukt. Vi har aktiverat RAM sessioner med minsta möjliga ansträngning utan att ha ändrat en rad av våran existerande kod.</p>
<p>Men nu när du har Memcache igång, så kanske du vill använda det för att spara övrig ofta-använda/sällan-ändrade variables också. Var så god och känn dig för och kolla <a href="http://www.php.net/manual/en/book.memcache.php">dokumentationen</a>. Du kommer att lära dig att Memcache kan utöka din serversidas prestanda rejält.</p>
]]></content:encoded>
			<wfw:commentRss>http://txc.se/2009/04/utoka-phps-sessions-hantering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
