hardcore php
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• [email protected]• 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