Kategoriarkiv: PHP

Skicka E-post via API med Mailgun

Sedan 2011 så har jag använt Amazon Simple E-mail Service (Amazon SES) för utskick av E-post men nu har jag blivit avstängd för att jag skickat E-post med för många studs. Dvs inaktiva eller på annat sätt E-postkonton som ej fungerar.

Därför tittade jag mig omkring lite och valet föll för Mailgun som verkade kompetent. Installerade deras PHP bibliotek som pratar mot API:et men tyvärr så fungerade det dåligt med konstiga felmeddelanden om felaktig API Endpoint. Till slut så hittade jag en annan kod som använder sig av curl .

Så koden blev till slut så här:

Tidigare så har jag definerat MAILGUN_API som innehåller min API-nyckel samt DOMAIN som innehåller domännamnet som används. Även så måste funktionerna br2nl() och error() skapas och du kan nog lista ut vad dom gör.

Än så länge fungerar det bra, men måste nog implementera rate-limiting med Redis så det inte skickas ut för mycket mail av misstag.

Underlätta din vardag med PHP

Du kanske laddar in alla dina klasser på liknande sätt i dagsläget:

require_once "/foo/bar.php";
require_once "/foo/blahonga.php";
require_once "/foo/func.php";
require_once "/foo/blipp.php";

Detta är suboptimalt och här kan SPL hjälpa dig, ”SPL is a collection of interfaces and classes that are meant to solve standard problems.”

SPL har en funktion som heter spl_autoload_register() som automatiskt laddar in de klasser som du använder från de filer som ligger i katalogen i följande kodsnutt:

set_include_path(realpath('/path/to/lib') . PATH_SEPARATOR . get_include_path());

function autoload($className)
{
 require($className . '.php');
}

spl_autoload_register('autoload');

$Database = new Database();

Brandon har även skrivit om detta här:

brandonsavage.net/making-life-better-with-the-spl-autoloader

Att skriva bra kod

På senare tid så lägger jag mer tid och kraft till att skriva bra (snygg) och snabb kod. Att optimera sin PHP-kod kan spara många millisekunder i exekveringen. Vad pratar jag om då? Jo det finns några bra tips:

Kolla igenom all din kod med xdebug för att hitta långsamma exekveringar/funktioner. Och använd med fördel memcached, Sphinx och eAccelerator. Kasta bort Apache och titta istället på nginx och lighttpd. Jag har tidigare skrivit om hur du optimerar MySQL.

Det lönar sig att göra rätt från början!

Felsökning Apache

En av mina servrar börjar gå på knäna och antalet Apache-processer låg runt 200 stycken vilket är det maxtak jag definerat med ”RLimitNPROC 200 200” i config-filen för Apache.

Jag började min felsökning  och som vanligt så undersökte jag MySQL-datbasen vad det kan vara som kan gå långsamt men hittade inget där (show processlist samt mysql-slow.log).

Men efter lite tips från Webmasters Network så la jag till ExtendedStatus On och där uppenbarade det sig vilken virtuell host som tog all kapacitet och vilket script.

Så jag la till en ”LIMIT 1” i slutet på en SQL-update och la en bild på ett CDN som ofta hämtades och vips så sjönk antelet Apache-processer till enbart 50 stycken:

Total accesses: 28353 – Total Traffic: 137.8 MB
CPU Usage: u6.84 s1.18 cu.39 cs0 – .249% CPU load
8.39 requests/sec – 41.7 kB/second – 5095 B/request
45 requests currently being processed, 7 idle workers

Någon som kan knäcka nöten?

Jag gillar memcache och använder det flitigt här och var. Men tyvärr så stängs inte kopplingen ner korrekt någonstans i koden och jag vet inte riktigt var. Detta resulterar i att massor av TCP-koppel hamnar i TIME_WAIT:

$ netstat -n|grep -c TIME_WAIT

5449

Har du någon lösning på mitt problem eller tips på hur jag kan hitta vart kopplet inte stängs ner korrekt i PHP-koden?

Skapa en webbtjänst med WordPress

Jag har länge velat att testa att bygga en hel sajt (icke blogg) med hjälp av WordPress. Så jag funderade lite på vad för sajt jag skulle bygga och kom på att jag hade ca 70 000 .pad-filer som låg och skräpade (.PAD-filer är xml-filer som beskriver program).

Så efter några få timmars hackande så fick jag ihop en sajt där man kan ladda hem nästan enbart användargenererat material: suhd.com

Lätt som en plätt med hjälp av dessa två funktioner:

  • wp_insert_post För att göra inlägget efter att information har extraherats från .PAD-filen
  • add_post_meta För att lägga till extra information om just denna fil/inlägg såsom nedladdningsurl

Samt ett eget theme som sedan använder get_post_meta för att hämta metainformationen från inlägget. Med fördel så kan ju även de tusentals plugins som finns till WordPress användas, jag använder exempelvis sociable.

Läs mer om PAD här: http://www.asp-shareware.org/pad/

Test av SliceHost

Fick några minuter över i dag så testade den amerikanska VPS-tjänsten SliceHost som Rackspace äger. Det tog enbart 5 minter för mig att vara i gång och konfigurera den Ubuntu-version som jag valt. Ser lovande ut än så länge och avser att flytta download11.com dit inom en snar framtid då majoriteten av besökarna är från andra sidan atlanten (download11 använder sig av SimpleCDN sedan tidigare).

Jag återkommer med en utförligare rapport med eventuellt för och nackdelar.

Prissättningen ser ut enligt följande:

slicehost

Såg även att svenska Crystone startat en ny VPS-tjänst på Server.se

Amazon CloudFront – Så kommer du igång

Det är nu fyra dagar sedan som Bloggy tog ett första steg till att bli en ”del av molnet”-tjänst. Det första steget innebär att alla statiska objekt ligger på Amazon CloudFront-tjänsten.

Eftersom jag hade gjort en implementation till Bloggy tidigare som använde sig av SimpleCDN så var det trivialt att byta ut två rader kod så att Bloggy istället använde sig av Amazon CloudFront.

Den PHP-implementation jag använder är denna: undesigned.org.za/2007/10/22/amazon-s3-php-class

Och den kod som jag använder mig för att ladda upp ett objekt i PHP är följande:

require_once "S3.class.php";
$s3 = new S3('accessKey', 'secretKey');
$s3->putObjectFile('file.doc', 'cf.bloggy.se', 'docs/file.doc', S3::ACL_PUBLIC_READ);

Detta förutsätter att jag redan innan skapat en CloudFront bucket med hjälp av s3cmd:

$ s3cmd --configure

Tips: Använder du Amazon S3 istället så bör du lägga till raden ”bucket_location = EU” i din ~/.s3cfg om du vill att dina buckets ska skpas i europa.

$ ./s3cmd mb s3://cloudfront.bloggy.se 

 

 

Bucket 's3://cloudfront.bloggy.se/' created
$ ./s3cmd cfcreate s3://cloudfront.bloggy.se 

Distribution created: Origin:         s3://cloudfront.bloggy.se/ 

DistId:         cf://E3VE9DJIVFQYO3 

DomainName:     d1bq8ovpea0j10.cloudfront.net 

CNAMEs: 

Comment:        http://cloudfront.bloggy.se.s3.amazonaws.com/ 

Status:         InProgress 

Enabled:        True Etag:           

E2N0AVZ9F1WJZL 

 

 

$   

Som ovan visar så är Status: InProgress och efter några minuter så visas Status: Deployed.

Om du vill använda ditt eget domännamn exempelvis cloudfront.bloggy.se (DNS != bucketnamn) så måste detta sättas som CNAME parameter på den bucketen eller så använder du

Andra bra kommandon: s3cmd ls samt s3cmd cfinfo för att visa dina buckets samt status.

För att sedan synkronisera statiska objekt såsom CSS-filer så behöver du enbart göra enligt följande:

$ ./s3cmd sync /var/www/bloggy.se/docs/css/ s3://cloudfront.bloggy.se

Efter fyra dagar så ser min förbrukning/dollars ut så här (klicka på bilden):

amazonJag har tidigare jämfört Amazon S3 med CloufFront.