Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tuenti - Hardcore PHP - UAM

Kartones
November 24, 2011

Tuenti - Hardcore PHP - UAM

@ Universidad Autónoma de Madrid (2011)

Kartones

November 24, 2011
Tweet

More Decks by Kartones

Other Decks in Programming

Transcript

  1. INTRO • Senior Frontend Engineer @ Tuenti • C#/.NET background,

    now a bit of PHP knowledge • [email protected] • twitter.com/kartones
  2. AGENDA • The Goal • Shared Hosting to Tuenti-like scale

    webs • Typical PHP • PHP Practices • Coding Practices • Web Practices
  3. TYPICAL PHP •HTML + PHP script blocks + DB Queries

    •If lucky, separated into ¨functions¨ and templates (PHPBB, Wordpress…) •No Object Orientation
  4. TYPICAL PHP News 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>
  5. TYPICAL PHP News 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>
  6. TYPICAL PHP News 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>
  7. TYPICAL PHP News 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>
  8. TYPICAL PHP function crop_string($string) { if (strlen($string) > 30) {

    $string = substr($string, 0, 30) . “…”; } return $string; } $text = crop_string(“developers,developers,developers,developers”);
  9. TYPICAL PHP class 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”);
  10. PHP PRACTICES •PHP 5.3 (or the newest stable version) •Object

    Orientation •Namespaces / structured source code tree
  11. PHP PRACTICES •Breaking loops is ugly for($i = 0; $i

    < count($items); $i++) { if ($items[$i] == searchedItem) { break; } }
  12. PHP PRACTICES •Break-free $found = false; for($i = 0; $i

    < count($items) && !$found; $i++) { if ($items[$i] == searchedItem) { $found = true; } }
  13. PHP PRACTICES • Try to keep memory usage low •Less

    memory, more concurrent PHP processes • unset() • ini_set(“memory_limit”,”8M”);
  14. 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
  15. 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
  16. PHP PRACTICES • Avoid non testeable objects class Game {

    private $player1 = new GamePlayer(); private $player2 = new GamePlayer(); public function Play() { // Logic that uses $player1 & $player2 } }
  17. PHP PRACTICES • Create testeable objects class 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 } }
  18. 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
  19. CODING PRACTICES Learn & do Testing •Unit tests •Test DB

    data (Fixtures) •Mock Objects •Integration tests •Acceptance tests
  20. WEB PRACTICES •Learn Kung-fu: •HTTP protocol basics •Some Javascript •Minimal

    CSS •Robots.txt •Favicon.ico •Sitemap.xml •Cookies •Encoding •Web Security basics
  21. 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)
  22. WEB PRACTICES •Use the client to store data •Cookies (4KB

    max) •LocalStorage (HTML5) •Global scoped Javascript variables (AJAX only) •Javascript Datasources (Tuenti AJAX)
  23. WEB PRACTICES •If you don’t need realtime, be lazy •Lazy

    loading •Lazy deletion •Job queues instead of realtime operations