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
56
Python static typing with MyPy
kartones
0
93
High-impact refactors keeping the lights on
kartones
0
78
Remote Work
kartones
0
110
Geospatial CSV Imports Hidden Complexity
kartones
0
63
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
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
370
sbt 2.0: takeoff
eed3si9n
0
160
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
1k
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
4
3.5k
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
17k
SREの越境 / SRE Collaboration
y0hgi
2
310
Next.js: The final boss of Web Performance
guaca
0
260
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
210
すこし踏み込む CancellationToken
htkym
2
1.7k
ActionController meets Protocol Buffers
sorah
0
520
Domain-Driven Transformation
hschwentner
2
2.3k
Featured
See All Featured
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
570
Code Reviewing Like a Champion
maltzj
529
40k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
First, design no harm
axbom
PRO
2
1.3k
Speed Design
sergeychernyshev
33
2.2k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
What the history of the web can teach us about the future of AI
inesmontani
PRO
2
740
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
The Language of Interfaces
destraynor
162
27k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
480
Navigating Team Friction
lara
192
16k
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