Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Tuenti - Hardcore PHP - UAM
Search
Kartones
November 24, 2011
Programming
230
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
55
Python static typing with MyPy
kartones
0
91
High-impact refactors keeping the lights on
kartones
0
76
Remote Work
kartones
0
110
Geospatial CSV Imports Hidden Complexity
kartones
0
62
Intro to GameBoy Development
kartones
0
110
Myths & The Real World of OpenSource Development
kartones
0
55
CartoDB Tech Intro
kartones
0
59
Copy Protection & Cracking History
kartones
0
150
Other Decks in Programming
See All in Programming
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.4k
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
290
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.1k
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
370
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
130
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
840
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
380
Heart of Swift Concurrency
koher
0
950
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
530
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
490
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
640
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
4
3.2k
Featured
See All Featured
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
230
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
200
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
410
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
250
The Spectacular Lies of Maps
axbom
PRO
1
1k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
850
The Pragmatic Product Professional
lauravandoore
37
7.4k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.1k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
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