hardcore php

Post on 11-May-2015

3.456 Views

Category:

Education

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

Diego "Kartones" Muñoz mostrará ciertos trucos y metodología de PHP y AJAX para desarrollos del calibre de Tuenti, empresa que todos conocemos.

TRANSCRIPT

INTRO

• Senior Frontend Engineer @ Tuenti• C#/.NET background, now a bit of PHP

knowledge• diego@tuenti.com• twitter.com/kartones

AGENDA

• The Goal• Shared Hosting to Tuenti-like scale

webs• Typical PHP• PHP Practices• Coding Practices• Web Practices

THE GOAL

THE REAL GOAL

Avoid the PHP joke

THE REAL REAL GOAL

Build quality PHP code

SHARED HOSTING

Internet

Frontend + DB

FIRST SPLIT

Internet

Frontend

DB

MORE FRONTENDS

Internet

Frontends

DB

CACHING TIME

Internet

Frontends

DB

Cache

MORE CACHING

Internet

Frontends

DB

Cache

MASTER/SLAVE DBS

Internet

Frontends

DBs

Cache

TUENTI (OVERVIEW)

Internet

Farm 1 Farm 2 Farm N Others

Frontends

Caches

DBs

TYPICAL PHP

•HTML + PHP script blocks + DB Queries•If lucky, separated into ¨functions¨ and templates (PHPBB, Wordpress…)•No Object Orientation

TYPICAL PHPNews since your last visit:<ul><? $e = $_POST['email'];$news = mysql_query("SELECT * FROM news WHERE email='{$e}'");[…]foreach($news as $newsItem){ ?> <li><?=$newsItem[0]?></li> <?}?></ul>

TYPICAL PHPNews since your last visit:<ul><? $e = $_POST['email'];$news = mysql_query("SELECT * FROM news WHERE email='{$e}'");[…]foreach($news as $newsItem){ ?> <li><?=$newsItem[0]?></li> <?}?></ul>

TYPICAL PHPNews since your last visit:<ul><? $e = $_POST['email'];$news = mysql_query("SELECT * FROM news WHERE email='{$e}'");[…]foreach($news as $newsItem){ ?> <li><?=$newsItem[0]?></li> <?}?></ul>

TYPICAL PHPNews since your last visit:<ul><? $e = $_POST['email'];$news = mysql_query("SELECT * FROM news WHERE email='{$e}'");[…]foreach($news as $newsItem){ ?> <li><?=$newsItem[0]?></li> <?}?></ul>

TYPICAL PHPfunction crop_string($string) { if (strlen($string) > 30) { $string = substr($string, 0, 30) . “…”; } return $string;}

$text = crop_string(“developers,developers,developers,developers”);

TYPICAL PHPclass StringHelper{ const CROP_ELLIPSIS = ‘…’; const CROP_DEFAULT_SIZE = 30;

public static function Crop($text, $cropLength = self::CROP_DEFAULT_SIZE) { if (mb_strlen($text) > $cropLength) { $croppedText = substr($text,0,$cropLength) . Self::CROP_ELLIPSIS; } else { $croppedText = $text; } return $croppedText;}

$text = StringHelper::Crop(“developers,developers,developers,developers”);

PHP PRACTICES

•PHP 5.3 (or the newest stable version)•Object Orientation•Namespaces / structured source code tree

PHP PRACTICES

•Layered code•MVC is typical and good

Controller

ModelView

PHP PRACTICES

•Breaking loops is uglyfor($i = 0; $i < count($items); $i++){

if ($items[$i] == searchedItem){

break;}

}

PHP PRACTICES

•Break-free$found = false;for($i = 0; $i < count($items) && !$found; $i++){

if ($items[$i] == searchedItem){

$found = true;}

}

PHP PRACTICES

• Try to keep memory usage low• Less memory, more concurrent PHP processes• unset()• ini_set(“memory_limit”,”8M”);

PHP PRACTICES

•Singleton in PHP != Singleton in Java/C#/C++•Same PHP execution = same singleton•2 page requests = 2 different singletons•Terribly dangerous in tests• Implement a ¨flushSingleton()¨ static method

PHP PRACTICES

•Homogeneous code•Comments•@author tag (Sign your code!)•Proper variables casing & naming•Good source tree = easy to guess where to find a class•Avoids personal bad practices

PHP PRACTICES

• Avoid non testeable objectsclass Game { private $player1 = new GamePlayer(); private $player2 = new GamePlayer(); public function Play() { // Logic that uses $player1 & $player2 }}

PHP PRACTICES

• Create testeable objectsclass Game { private $player1 = null; private $player2 = null; public function __construct(IGameEntity $playerA, IGameEntity $playerB) { $this->player1 = $playerA; $this->player2 = $playerB; }

public function Play() { // Logic that uses $player1 & $player2 }}

PHP PRACTICES

• Defensive Programming• defined()• isset()• class_exists()• method_exists()

CODING PRACTICES

Learn & use Source Code Control•Distributed• Best options: SVN,Git, Mercurial

• Always linked to a ticket control system• Learn to branch, diff, merge, resolve conflicts•Hard at first, pays off in big projects

CODING PRACTICES

Learn & do Testing•Unit tests• Test DB data (Fixtures)•Mock Objects

• Integration tests•Acceptance tests

WEB PRACTICES

•Learn Kung-fu:•HTTP protocol basics• Some Javascript•Minimal CSS• Robots.txt• Favicon.ico• Sitemap.xml• Cookies• Encoding•Web Security basics

WEB PRACTICES

•Minimize HTML, CSS, JS•Google closure Compiler•YuiCompressor•Firebug•Use tools to detect improvements:•PageSpeed (Firefox/Chrome)•YSlow (Firefox)•MySpace Performance Tracker (IE)

WEB PRACTICES

•Use the client to store data•Cookies (4KB max)•LocalStorage (HTML5)•Global scoped Javascript variables (AJAX only)• Javascript Datasources (Tuenti AJAX)

WEB PRACTICES

•If you don’t need realtime, be lazy•Lazy loading•Lazy deletion• Job queues instead of realtime operations

THE END

¿Questions?

http://dev.tuenti.comhttp://jobs.tuenti.com

top related