Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Tuenti - Hardcore PHP - UAM
Search
Kartones
November 24, 2011
Programming
230
1
Share
Tuenti - Hardcore PHP - UAM
@ Universidad Autónoma de Madrid (2011)
Kartones
November 24, 2011
More Decks by Kartones
See All by Kartones
Building Autonomous Agents with gym-retro
kartones
0
46
Python static typing with MyPy
kartones
0
71
High-impact refactors keeping the lights on
kartones
0
68
Remote Work
kartones
0
97
Geospatial CSV Imports Hidden Complexity
kartones
0
56
Intro to GameBoy Development
kartones
0
100
Myths & The Real World of OpenSource Development
kartones
0
49
CartoDB Tech Intro
kartones
0
50
Copy Protection & Cracking History
kartones
0
130
Other Decks in Programming
See All in Programming
Smarter Angular mit Transformers.js & Prompt API
christianliebel
PRO
1
120
一度始めたらやめられない開発効率向上術 / Findy あなたのdotfilesを教えて!
k0kubun
4
2.8k
存在論的プログラミング: 時間と存在を記述する
koriym
5
780
瑠璃の宝石に学ぶ技術の声の聴き方 / 【劇場版】アニメから得た学びを発表会2026 #エンジニアニメ
mazrean
0
160
Coding as Prompting Since 2025
ragingwind
0
740
Vibe하게 만드는 Flutter GenUI App With ADK , 박제창, BWAI Incheon 2026
itsmedreamwalker
0
540
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
300
GoのDB アクセスにおける 「型安全」と「柔軟性」の両立 - Bob という選択肢
tak848
0
310
KagglerがMixSeekを触ってみた
morim
0
370
LM Linkで(非力な!)ノートPCでローカルLLM
seosoft
0
400
Spec Driven Development: The End Of Vibe Coding | DevLand 2026
danielsogl
PRO
0
110
事業会社でのセキュリティ長期インターンについて
masachikaura
0
230
Featured
See All Featured
WENDY [Excerpt]
tessaabrams
9
37k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
199
73k
Making Projects Easy
brettharned
120
6.6k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
The Spectacular Lies of Maps
axbom
PRO
1
680
Designing Powerful Visuals for Engaging Learning
tmiket
1
330
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
320
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
340
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.8k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.4k
Heart Work Chapter 1 - Part 1
lfama
PRO
5
35k
Transcript
None
None
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 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>
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>
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>
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>
TYPICAL PHP function crop_string($string) { if (strlen($string) > 30) {
$string = substr($string, 0, 30) . “…”; } return $string; } $text = crop_string(“developers,developers,developers,developers”);
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”);
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
Model View
PHP PRACTICES •Breaking loops is ugly for($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 objects class Game {
private $player1 = new GamePlayer(); private $player2 = new GamePlayer(); public function Play() { // Logic that uses $player1 & $player2 } }
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 } }
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.com http://jobs.tuenti.com