Kategoriarkiv: PHP

Inloggningsförfarande

När jag bygger webbsajter nu för tiden så tänker jag efter mer än en gång vilken typ av inloggning som krävs och vad som är lämpligast. Det finns flera olika sätt och alla har sina för och nackdelar, så jag tänkte gå igenom några av dessa inloggningsförfarande här:

OpenID/FaceBook Connect/Google

Testade senast i går att använda den funktionalitet rpxnow.com erbjuder för inloggning via OpenID/Facebook Connect/Google och detta fungerade mycket bra. Värt att tänka på är att om du som sajtägare vill få uppgifter om exempelvis E-post så lämnas inte detta ut från exempelvis Facebook. Detta inloggningsförfarande är ypperligt bra då användaren ej behöver hålla koll på lösenord men kräver så klart att användaren har ett konto på någon av dessa sajter och det som du som utvecklare måste tänka på är att lagra <identifier> värdet någonstans.

Inloggning via tredjepartssajt


Om du utvecklar en applikation som använder sig av exempelvis Twitter så kan autentisering och verifiering ske direkt över Twitter genom direktmeddelanden. Exempel på ett förfarande:

  1. Följ @foobar
  2. Få ett lösenord av @foobar
  3. Logga in på sajten foobar.com med lösenordet

Med detta förfarande så behövs enbart steg 1 för att bli ”medlem” vilket snabbt kan resultera i många medlemmar.

Traditionell inloggning

Med detta menar jag att en E-postadress samt lösenord används, även här kan det vara värt att tänka till lite för att underlätta för användare att registrera sig. Exempelvis så kan det eventuellt vara tillräckligt att fråga efter E-post och skicka ett lösenord i efterhand och direkt logga in användaren utan verifiering, denna verifiering av korrekt E-post kan då ske i efterhand.

Var oberoende

I min strävan efter att bygga bra och trevliga tjänster på webben så har jag alltid försökt att hålla mig oberoende. Och vad menar jag med oberoende då? Jo att inte bli beroende av en enda kompontent/företag etc samt alltid ha en backup-plan.

Låt mig ge några exempel:

Förlita dig inte på en enda Internetleverantör

Ingen internetleverantör är att lita på. Alla har sina fel och brister så därför kommer det förmodligen bli problem någon gång, se då till att ha en backup-plan. Exempelvis så använder jag alltid minst 2 leverantörer av server-kapacitet. Minst 2 när det gäller DNS osv

Förlita dig inte på ett enda programmerinsspråk

PHP är helt ok och får jobbet gjort snabbt men är suboptimalt om du vill skriva högpresterande trådade applikationer. Inte säkert att Python som jag gillar heller klarar av jobbet och då föredrar jag C.

Diversera dina inkomster

Se till att inte förlita dig på en enda affiliate, exempelvis Google Adsense. En vacker dag så kanske de vänder dig ryggen utan anledning och då står du där med byxorna nere.

Så slutordet i detta inlägg:

Håll dig oberende och ha alltid minst en backup-plan om något skulle gå fel för det kommer att hända något förr eller senare.

Hur håller du dig oberoende?

Avlasta din webbsajt med ett CDN

CDN står för Content Delievery Network och är namnet på en tjänst där en eller flera servrar tar hand om din lagring på webben. Exempelvis så har Microsoft använt sig av Akamai och liknande tjänster för att se till att uppdateringar till Windows alltid går snabbt att ladda hem.

Det finns ett antal CDN-leverantörer och priser och funktionalitet skiljer sig en hel del beroende på vilken man väljer men man brukar få betala per överförd gigabyte.

Så hur kan ett CDN hjälpa dig undrar du kanske? Jo du kanske har en webbsajt med massor av statisk information såsom CSS, bilder eller kanske tunga filmer och här kommer ett CDN in i bilden.

Jag gjorde en snabb koll på min sajt download11.com över vilka filer som laddades in oftast:

/style.css
/bg.gif
/navigation.css
/nifty.js
/header-bg.png
/images/feed16.png
/images/download.gif
/favicon.ico

Och samtliga av dessa filer kan avlasta min webbserver genom att överföras till en CDN-leverantör. Jag testar för tillfället SimpleCDN.com och det tog mig max 20 minuter innan jag var igång och de serverade filer åt mig.

Jag har nu ett CNAME för files.download11.com som går till files.simplecdn.net där mina statiska filer nu ligger (files är ett namn som jag själv valt för min ”upload bucket”).

Bra CDN-leverantörer använder sig även av anycast-teknik vilket även innebär att de är mindre känsliga för belastningsattacker då samma IP-nummer återfinns på flera ställen.

Tips på några fler CDN-leverantörer förutom Akamai och SimpleCDN:

Övervaka din server med Munin

Munin är en trevlig klient/server mjukvara som övervakar din servers prestanda och visar denna på ett antal fina grafer. Enligt dem själva:

Munin the monitoring tool surveys all your computers and remembers what it saw. It presents all the information in graphs through a web interface. Its emphasis is on plug and play capabilities. After completing a installation a high number of monitoring plugins will be playing with no more effort.

Så jag tog mig tid för några dagar sedan och installerade server-delen på en av mina servrar samt klient-delen på ett antal andra servrar där jag ville övervaka prestandan och här kommer ett axplock med några av de grafer som genereras:

Servern där bloggy.se ligger:

Severn där bloggz.se, bloggvarde.se, bloggbackup.se mfl. ligger:

Antalet MySQL-frågor per sekund

Installation av Munin

Installationen är tämligen trivial iallafall under Unbutu och installationen sker enligt följande på server-delen:

$ sudo apt-get install munin

Och på klienterna (noderna):

$ sudo apt-get install munin-node

Efter detta så skapas en katalog /etc/munin/ där munin.conf finns på servern och munin-node.conf finns på klienterna (server och klient-del kan så klart köras på samma server).

På klienterna behövs enbart en rad läggas till i munin-node.conf och det är vilket IP-nummer som ska få behörighet att hämta statistik-data, exempelvis:

allow ^83\.23\.91\.1$

På servern så läggs följande rader till:

[bloggy]
    address 79.99.2.33
    use_node_name yes

Efter några minuter bör filer skapas i katalogen /var/www/munin/ som du sedan måste göra tillgänlig för din webbserver.

Om du som jag skulle sakna någon av graferna så kontrollera symlänkarna i katalogen /etc/munin/plugins. Jag var tvungen att lägga till så att /etc/munin/plugins/apache_processes symlänkades till /usr/share/munin/plugins/apache_processes för att få graferna för antalet apache-processer.

Övervaka dina tjänster med Monit

Jag har haft lite problem med Apache2 + PHP5 och en nödlösning just nu är att använda en mjukvara som håller koll på om Apache inte svarar som den ska. Och i mina sökningar efter en mjukvara som är kompetent och kan göra detta så hittade jag Monit.

Monit installeras och konfigureras på under 10 minuter enligt följande:

# apt-get install monit

editera /etc/monit/monitrc och lägg dit exempelvis följande rader:

check process apache2 with pidfile /var/run/apache2.pid
group apache
start program = ”/etc/init.d/apache2 start”
stop program = ”/etc/init.d/apache2 stop”
if failed host 127.0.0.1 port 80
protocol http then restart
if 5 restarts within 5 cycles then timeout

set mailserver localhost

set mail-format { from: [email protected]
subject: $SERVICE $EVENT at $DATE
message: Monit $ACTION $SERVICE at $DATE on $HOST: $DESCRIPTION.
}

set alert [email protected]
set logfile syslog facility log_daemon

Så var det klart! Nu övervakas tjänsten och lirar den inte så startas den om automagiskt (om nu en omstart hjälper problemet i fråga). Andra tjänster såsom sshd och mysql kan så klart också övervakas av monit.

Monit hittas: http://www.tildeslash.com/monit/

ffmpeg

Jag har hållt på att donat och strulat och försökt att få ffmpeg att lira med mer videoformat och codecs men det har inte varit en helt smärtfri väg att få till allt. Vet inte riktigt var jag ska börja men ffmpeg är ett verktyg för att hantera filmer på en massa sätt, exempelvis konvertering.

Genom att köra ffmpeg -v så konstaterade jag att varken libmp3lame eller libamr (3GPP/3GP) var inkompilerat i standardbinären på Ubuntu Edgy som jag kör:

FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2007 Fabrice Bellard, et al.
configuration: –enable-gpl –enable-pp –enable-swscaler –enable-pthreads –enable-libvorbis –enable-libtheora –enable-libogg –enable-libgsm –enable-dc1394 –disable-debug –enable-shared –prefix=/usr

Så klart så testar jag ju att använda apt-src install ffmpeg och sedan modifiera debian/rules filen för att tillfredställa mina behov, men icket! Otaliga kompileringsfel i amr vilket jag försöker fixa men ger upp efter ett tag.

Dags och byta taktik, checkar ut en fräsch ffmpeg version från svn:

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg-svn

Och efter att kliat huvet och kompilerat om ffmpeg ett antal gånger och installerat ett antal ubuntu paket såsom libamrnb3 libamrnb-dev libamrwb-dev libamrwb3 amrwb amrnb liblame-dev libxvidcore4-dev libfaac-dev libfaad2-dev för att bara nämna några så börjar det att ljusna.

ffmpeg -v ger mig nu:

FFmpeg version SVN-r14864, Copyright (c) 2000-2008 Fabrice Bellard, et al.
configuration: –enable-gpl –enable-nonfree –enable-swscale –enable-avfilter –enable-pthreads –enable-liba52 –enable-libamr-nb –enable-libamr-wb –enable-libmp3lame –enable-libgsm –enable-libmp3lame –enable-libvorbis –enable-libx264 –enable-libfaac –enable-static

Och det går betydligt lättare att konvertera mellan en massa videoformat.

Uppgradering av Ubuntu

Den Co-Location server som har hand om nästan samtliga av mina projekt körde tidigare Ubuntu 6.04 LTS så jag kände att det var dags att uppgradera till den nyare versionen Ubuntu 8.04 LTS Server Edition. LTS står för Long Term Suport och betyder att det kommer att släppas patchar till denna version fram till år 2013.

Genom att följa uppgraderingsförfarandet som presenteras på Ubuntu:s sida så gick uppgraderingen näst intill smärtfritt:

Steg 1, uppgradera till version 7.10

sudo aptitude install update-manager-core
sudo do-release-upgrade

Svara på frågor, starta om.

Steg 2, uppgradera till version 8.04

sudo do-release-upgrade

Svara på frågor, starta om.

De problem jag stötte på var enligt följande:

AppArmor

AppArmor är påslaget standard i version 8.04 och aktiverat i ”complain” mode för exempelvis MySQL och har du annat än standarsökvägar till filerna där databaserna ligger så får du följande felmeddelande:

audit(1210329486.124:240): type=1502 operation=”inode_permission” requested_mask=”r::” denied_mask=”r::” name=”/u0/mysql/domaintool/title.frm” pid=10822 profile=”/usr/sbin/mysqld” namespace=”default”

Genom att lägga till en rad /etc/apparmor.d/usr.sbin.mysqld som förklarar att även sökvägen /u0/mysql/ skall innefattas så slutar felmeddelandet att dyka upp.

Vill du läsa mer om AppArmor kan du göra det här:

Memcache

Av någon konstig anledning så försvinner raden extension=memcache.so som återfinns längst ner i /etc/php5/apache2/php.ini vilket resulterar i att memcache inte fungerar och följande felmeddelande dyker upp i webbserver loggarna:

PHP Fatal error: Class ’Memcache’ not found in /var/www/bloggnytt.se/docs/memcacheAPI.inc.php on line 33

Klart!

Uppgraderingen genomfördes med en knacklig 3G-uppkoppling över ssh.

Google REST API

När Google slutade dela ut API nycklar till deras SOAP API för några år sedan så var det många som blev sura och ledsna eftersom server-side applikationer som krävde nya nycklar inte gick att använda för att göra sökningar mot Google.

MEN! Igår så berättade Google att det är fritt fram att använda deras REST API för att ställa frågor och få tillbaka JSON formaterade söksvar:

The Google AJAX Search API is a Javascript library that allows you to embed Google Search in your web pages and other web applications. For Flash, and other Non-Javascript environments, the API exposes a raw RESTful interfaceNew! that returns JSON encoded results that are easily processed by most languages and runtimes.

Så här gör du i PHP med hjälp av curl för att ställa en sökfråga på ”Hello World” mot Google Search:

$url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Paris%20Hilton"

// sendRequest
// note how referer is set manually
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, "http://www.mysite.com/index.html");
$body = curl_exec($ch);
curl_close($ch);

// now, process the JSON string
$json = json_decode($body);
// now have some fun with the results...

Svårare än så är det inte! Vill du se vad du får från Google kan du använda print_r($json). Glöm inte felhantering.