Andreas Bergman

Icon

Dela sessioner mellan webbservar i PHP

När jag kom på att jag skulle skriva det här inlägget så tänkte jag skriva det i en önskelista, “saker jag vill se under 2012″, och en av dom var “Vettigt stöd för delade sessioner i ett kluster”.

Men, allt eftersom jag började läsa så såg jag att det är ju redan löst, med funktionen session_set_save_handler eller direkt i php.ini med memcached, då är det session.save_handler som gäller. Som default så använder PHP files, men det finns inbyggt stöd för memcache och det är superenkelt att aktivera.

session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"

Klart! Nu sparar PHP alla sessioner till din lokala memcacheburk, skulle du vilja spara det på en extern instans så är det bara att ersätta IP-adressen. Memcache är kanske inte helt optimalt för att spara data in, då det har en tendens att crasha och första datan. Så en kombination av (No)SQL och Memcache hade varit ett bra alternativ, SQL för säkerheten och Memcache för hastigheten, med NoSQL som typ MongoDB så kan man skippa Memcache.

I dokumentationen för PHP finns det bra exempel på hur du själv kan anpassa session_set_save_handler för att använda den backend du vill använda. @ChristofferP påpekade att bland annat PHP ramverket Litihum har stöd för alternativa session stores.

Fördelen med att kunna spara sessionen i ett delat storage är att man kan skippa sticky sessions när man lastbalanserar, och balansera jämnare över klustret. Om det är någon som vet om det finns ett smidigt sätt att inkludera sin egen sessionsklass i WordPress, säg till!

Förhindra exekvering av PHP i en mapp

För att förhindra att PHP-filer i en mapp kan exekveras av Apache2s mod_php, lägg till följande i .htaccess

<Directory />
php_admin_flag engine off
</Directory>

Där sökvägen motsvarar sökvägen till mappen du vill förhindra exekvering i.

CodeIgniter slutar fungera när jag aktiverar *_Auth

Jag har precis haft en massa problem med att min site som är byggd i CodeIgniter slutar funka så fort jag laddar ett library, jag hann testa med Dx_Auth Tank_Auth och Ion_Auth innan jag kom på vad felet var.

Jag saknade paketet php-mysql på min CentOS maskin.

Det roliga i det hela var att varken PHP, Apache2 eller CodeIgniter sa att något var fel, vilket känns lite skumt faktiskt.

Spotify och Codeigniter

Folket på We Up North har skapat ett CodeIgniterbibliotek för att hämta metadata från Spotify, fantastiskt!

http://weupnorth.se/blogg/spotify-metadata-och-codeigniter/

Screenshot på TrunkFish KVM Control integrerat i TrunkFish

Här kommer första screenshoten av TrunkFish KVM Control integrerat i TrunkFish!Lär mer om trunkfish här: http://dwall.in/blogg/trunkfish/varfor-skall-ett-crm-ha-kvm-styrning/

Version 0.1 PreAlpha av TrunkFish KVM Control

Första utkastet till TrunkFish KVM Control är nu klart, det är inte mycket för världen, men ett steg i rätt riktning!

Förhindra att PHP-FPM sänker din server

Igår kväll hade jag problem med att en av våra servrar höll på att gå under, vi har nyligen satt igång ett ganska prestandakrävande script på maskinen, och av någon anledning så verkar det ha hängt sig. Eftersom jag inte är skaparen av scriptet så låter jag det förbli osagt varför.

För att förhindra att PHP-FPM sänker din server så finns det en inbyggd funktion för att sätta max_execution_time, PHP har en egen variabel för det i php.ini, men om den inte funkar så kommer FPM döda workern åt dig. Det finns också en fin funktion som loggar vilka phpscript som kör för länge, på så sätt kan man hålla utkik och enkelt felsöka sina applikationer.

request_terminate_timeout = 30m
; The timeout for serving a single request after which a PHP backtrace will be
; dumped to the 'slowlog' file. A value of '0s' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
request_slowlog_timeout = 5s

; The log file for slow requests
; Default Value: /var/log/php5-fpm.log.slow
slowlog = /var/log/php5-fpm.log.slow

Jag väljer att ha 30minuters gräns för hur länge ett script får lov att köra, och det loggas i php5-fpm.log.slow efter 5s, på så sätt får jag snabbt information om ifall det är något som gått snett. Glöm inte starta om php5-fpm för att ändringarna ska slå igenom.


			

Generera iCalendar med Codeigniter

Mitt senaste projekt är att skriva ett enkelt bibliotek(library) i CodeIgniter för att generera iCalendar(http://en.wikipedia.org/wiki/ICalendar) filer. jag har ännu inte bestämt mig för om den ska generera riktiga filer, eller om jag ska låta den generera allt dynamiskt och bara skicka med lite headers. Det senare är det smartaste alternativet, men jag vet inte riktigt hur det är prestandamässigt. Det hade ju varit smidigt att kunna lagra all data i databasen istället för att hålla på och mecka med filer.

iCalendar är ett öppet och vedertaget sätt att dela kalenderposter, det används i både Outlook och iPhone samt Sunbird(kalender plugin/add-on) för Thunderbird, ett mozilla projekt med andra ord.

Återkommer med mer info när jag har det, planen är att släppa biblioteket som GPL så att alla kan ta del av det:)

Problem med att ladda upp ODT med CodeIgniter

Upptäckte precis att CodeIgniter 1.7.2 inte har .ODT tillagt i filen config/mimes.php, vilket gör att man inte kan ladda upp .odt filer med de inbyggda funktionerna. För att lösa det, lägg till den här raden:

'odt'   =>       array('application/x-vnd.oasis.opendocumet.text',
'application/vnd.oasis.opendocument.text'),

Det är viktigt att det skrivs på samma rad!

Ovanför raden som inleds med ‘eml’ i filen application/config/mimes.php

..mer om .ODT i PHP

Jag har de senaste dagarna använt systemet i den här posten(http://www.abergman.se/skapa-odt-dokument-med-odtphp/) för att kunna generera dokument on the fly från variabler som jag själv anger, både placeholders i form av %PLACEHOLDER% och fördefinierad text. Allt är databasbaserat och fint.

Jag lärde mig att man inte kan deklarera variabler on-the-fly med php, MEN man kan använda arrayer, jag löste det såhär:

$variabel = data;
$array[$variabel] = $variabel;

Det innebär att $array[data]  = data. Det är ett smidigt sätt när man till exempel vill döpa variabler från värden i en databas. Den här lösningen kommer att användas för att generera bla avtal i Ngcrm.

Den här bloggen

skriver jag, Andreas Bergman, vilket i sig inte bör vara så förvånande. Jag driver en SMS tjänst och jobbar som tekniker/allt i allo på SEA där jag bland annat driftar en stor bloggportal och ett webbhotell. Vi håller även på att bygga ett datacenter.


Jag har några microsoft titlar, ett gäng DELL certifikat och jobbar dagligen med hårt belastade webbservrar. Utöver det jobbar jag också med virtualisering och server/storage. Någon gång ibland säljer jag även server och storagelösningar.

Maila mig gärna om något av ovan, eller annat, jag är ganska trevlig sägs det. andreas@abergman.se.