Steve Kamerman | ScientiaMobile, Inc.
Co-Founder / Software Architect

High-Performance PHP with HipHop
2008 - Facebook's Challenge
●

Explosive growth

●

Need more servers!

●

Bottleneck: Page generation

●

20% of PHP time was in native code
Why is PHP so slow?
●

Symbol table lookups

●

No static binding

●

Dynamic typing

●

Share-Nothing-Architecture
2008-2010 – HipHop for PHP is born
●

400 Billion PHP-generated pageviews per
month!

●

Facebook invents HipHop for PHP

●

Deployed system-wide in 2010
HipHop for PHP

Research &
Development

HPHPc

HHVM
What is HipHop for PHP?
• Multi-threaded web server + PHP runtime
• HPHPc: PHP -> C++ translator
• HHVM: PHP virtual machine with JIT
compiler
• Typically 2x – 5x speed increase over stock
PHP + APC
HipHop for PHP Compiler (HPHPc)
●

Translates PHP code into C++

●

Dynamic typing makes this difficult

●

Function parity lacking

●

Long compilation time
Our Experience
●

Created WURFL Cloud REST API

●

Evaluated HPHPc

●

Improved Latency

●

Stability issues
Architecture
Internet

HAProxy
Load Balancer
(primary)

WURFL Node
HPHPc

Apache

WURFL Node
HPHPc

Apache

HAProxy
Load Balancer
(secondary)

WURFL Node
HPHPc

Apache

WURFL Node
HPHPc

Apache

Memcached

Memcached

Memcached

Memcached

MySQL

MySQL

MySQL

MySQL
Codebase Updates

http://www.github.com/kamermans/HAProxyAPI
Next-Gen HipHop: HHVM
●

Virtual Machine

●

Better PHP Support

●

JIT Compiler

●

Bytecode Survives Restart
How HHVM works
Internet

HHV
M

Web Server

Run Native
Code
Run Bytecode
Generate
Bytecode

JIT Compile
HHVM vs HPHPc Performance

http://www.hhvm.com/blog/875/wow-hhvm-is-fast-too-bad-it-doesnt-run-my-code
https://github.com/facebook/hhvm/blob/master/hphp/doc/ir.specification
Optimizing PHP for HHVM
●

Type Inference
–

PHP Gotcha: core function fail with (bool)false

●

HHVM Upgrades primitives

●

Use strict comparison
Don't care about type strict comparison?
You should. Trust me.
var_export("true" == true); // true  
var_export("false" == true); // true  
var_export("true" == (bool)"false"); // true
var_export(strpos("Steve Kamerman", "Kamerman") == true); // true  
var_export(strpos("Steve Kamerman", "Steve") == true); // false  
$test = "31 is too old!";
var_export(31 == $test); // true
var_export("31.0" == 31); // true
var_export("031" == 031); // false
var_export(31.0 == 31); // true
var_export($test += 1); // 32
Avoid global scope
●

●

Code in the global scope is interpreted since it
is (nearly) impossible to type-track
Even wrapping global code helps:
class foo{public static function bar(){
$something = "test";
echo $something;
}}foo::bar();

●

Better approach: don’t write crappy code!
Unique Classes, Functions, Constants
●

HHVM supports namespaces – use them!

●

MyAppBar and MyAppFooBar are not ambiguous

●

●

●

Avoid “dynamic” constants:
define("MY_CONST", $foo? "foo": "bar");
I can almost picture a feature request for
undefine() and redefine()
If they are truly constant, use const
Better approach: don't use define()
namespace MyApp;
class Config {
const MY_CONST = "I'm real constant";
private static $storage = array(
"PSEUDO_CONSTANT" => "What did you call me?",
);
public static function get($name) {
if (!array_key_exists($name, self::$storage)) {
throw new Exception(__CLASS__." property [$name] does
not exist");
}
return self::$storage[$name];
}
}
echo Config::MY_CONST."n";
Avoid dynamic variables
●

If you are using this syntax, there is a better way to solve
the problem:
$foo = "Wow, this hurts my brain!";
$var_name = "foo";
echo $$var_name;

●

●

extract() and compact() are sometimes used more
legitimately (ex: view rendering), but avoid them
If you need get_defined_vars() for non-testing code,
you need to rewrite it before someone sees it :)
Declare class properties
●

They should be declared anyway
$foo = new stdClass();
echo $foo->bar; // PHP Notice: Undefined
property

●

Getters are optimized
Perfomance Gain
●
●

Less than 5%, but still good practice
Sub-optimal functions still work, even
eval() and goto!

http://php.net/manual/en/control-structures.goto.php
Repo.Authoritative Mode
●

Pre-Analyze files

●

PHP files assumed unchanged

●

Delete cache manually
Current state of HipHop
●

HHVM v2.2.0 just released

●

Very close to PHP 5.4

●

Dozens of extensions

●

Performance nearly 5x

●

Goal: Support top 20 frameworks in 2013
Framework Support
Framework % Unit Tests Pass

Framework % Unit Tests Pass

Facebook PHP SDK 100

CodeIgniter 81

Paris9 100

Assetic 80

Idiorm9 100

Twig 78

Slim 99

Wordpress 76

Drupal 98

phpBB 0

Composer 97

CakePHP 0

Laravel 95

Joomla 0

yii 92

PHPMyAdmin 0

Symfony 91

zf2 0

PHPUnit2 90

Doctrine 0
Magento 0

http://www.hhvm.com/blog/875/wow-hhvm-is-fast-too-bad-it-doesnt-run-my-code
Why is it open source? Will it last?
●

Under PHP license, hard to separate

●

Public activity slowed in 2011

●

Under active public development in 2012-13

●

Dev team is active on IRC (freenode #hhvm)
Facebook's Commitment

“In years past we've had a few examples of projects which have not
been well supported, but we are now much better at growing and
sustaining community projects, including, lately, in mobile.
[HipHop for PHP] is absolutely a project that we stand strongly
behind… stay tuned.”
James Pearce, Head of Developer Advocacy at Facebook
References
●

●

●

●

●

Special thanks to the HipHop for PHP team!
https://www.facebook.com/hphp
Twitter: @HipHopVM
http://www.hhvm.com/
Sebastian Bergmann – Static Code Analysis with HipHop
http://sebastian-bergmann.de/archives/918-Static-Analysis-with-HipHop-for-PHP.html
http://www.slideshare.net/nickgsuperstar/static-analysis-for-php
https://github.com/sebastianbergmann/hhvm-wrapper
Haiping Zhao – HipHop Compiler for PHP? Transforming PHP into C++
http://www.youtube.com/watch?v=p5S1K60mhQU
Sara Golemon – Scaling with HipHop
http://www.youtube.com/watch?v=Dwek7dZDFN0
Ben Foster – Facebook Growth Data
http://www.benphoster.com/facebook-user-growth-chart-2004-2010/

IPC 2013 - High Performance PHP with HipHop

  • 1.
    Steve Kamerman |ScientiaMobile, Inc. Co-Founder / Software Architect High-Performance PHP with HipHop
  • 3.
    2008 - Facebook'sChallenge ● Explosive growth ● Need more servers! ● Bottleneck: Page generation ● 20% of PHP time was in native code
  • 4.
    Why is PHPso slow? ● Symbol table lookups ● No static binding ● Dynamic typing ● Share-Nothing-Architecture
  • 5.
    2008-2010 – HipHopfor PHP is born ● 400 Billion PHP-generated pageviews per month! ● Facebook invents HipHop for PHP ● Deployed system-wide in 2010
  • 6.
    HipHop for PHP Research& Development HPHPc HHVM
  • 7.
    What is HipHopfor PHP? • Multi-threaded web server + PHP runtime • HPHPc: PHP -> C++ translator • HHVM: PHP virtual machine with JIT compiler • Typically 2x – 5x speed increase over stock PHP + APC
  • 8.
    HipHop for PHPCompiler (HPHPc) ● Translates PHP code into C++ ● Dynamic typing makes this difficult ● Function parity lacking ● Long compilation time
  • 9.
    Our Experience ● Created WURFLCloud REST API ● Evaluated HPHPc ● Improved Latency ● Stability issues
  • 10.
    Architecture Internet HAProxy Load Balancer (primary) WURFL Node HPHPc Apache WURFLNode HPHPc Apache HAProxy Load Balancer (secondary) WURFL Node HPHPc Apache WURFL Node HPHPc Apache Memcached Memcached Memcached Memcached MySQL MySQL MySQL MySQL
  • 11.
  • 12.
    Next-Gen HipHop: HHVM ● VirtualMachine ● Better PHP Support ● JIT Compiler ● Bytecode Survives Restart
  • 13.
    How HHVM works Internet HHV M WebServer Run Native Code Run Bytecode Generate Bytecode JIT Compile
  • 14.
    HHVM vs HPHPcPerformance http://www.hhvm.com/blog/875/wow-hhvm-is-fast-too-bad-it-doesnt-run-my-code https://github.com/facebook/hhvm/blob/master/hphp/doc/ir.specification
  • 15.
    Optimizing PHP forHHVM ● Type Inference – PHP Gotcha: core function fail with (bool)false ● HHVM Upgrades primitives ● Use strict comparison
  • 16.
    Don't care abouttype strict comparison? You should. Trust me. var_export("true" == true); // true   var_export("false" == true); // true   var_export("true" == (bool)"false"); // true var_export(strpos("Steve Kamerman", "Kamerman") == true); // true   var_export(strpos("Steve Kamerman", "Steve") == true); // false   $test = "31 is too old!"; var_export(31 == $test); // true var_export("31.0" == 31); // true var_export("031" == 031); // false var_export(31.0 == 31); // true var_export($test += 1); // 32
  • 17.
    Avoid global scope ● ● Codein the global scope is interpreted since it is (nearly) impossible to type-track Even wrapping global code helps: class foo{public static function bar(){ $something = "test"; echo $something; }}foo::bar(); ● Better approach: don’t write crappy code!
  • 18.
    Unique Classes, Functions,Constants ● HHVM supports namespaces – use them! ● MyAppBar and MyAppFooBar are not ambiguous ● ● ● Avoid “dynamic” constants: define("MY_CONST", $foo? "foo": "bar"); I can almost picture a feature request for undefine() and redefine() If they are truly constant, use const
  • 19.
    Better approach: don'tuse define() namespace MyApp; class Config { const MY_CONST = "I'm real constant"; private static $storage = array( "PSEUDO_CONSTANT" => "What did you call me?", ); public static function get($name) { if (!array_key_exists($name, self::$storage)) { throw new Exception(__CLASS__." property [$name] does not exist"); } return self::$storage[$name]; } } echo Config::MY_CONST."n";
  • 20.
    Avoid dynamic variables ● Ifyou are using this syntax, there is a better way to solve the problem: $foo = "Wow, this hurts my brain!"; $var_name = "foo"; echo $$var_name; ● ● extract() and compact() are sometimes used more legitimately (ex: view rendering), but avoid them If you need get_defined_vars() for non-testing code, you need to rewrite it before someone sees it :)
  • 21.
    Declare class properties ● Theyshould be declared anyway $foo = new stdClass(); echo $foo->bar; // PHP Notice: Undefined property ● Getters are optimized
  • 22.
    Perfomance Gain ● ● Less than5%, but still good practice Sub-optimal functions still work, even eval() and goto! http://php.net/manual/en/control-structures.goto.php
  • 23.
    Repo.Authoritative Mode ● Pre-Analyze files ● PHPfiles assumed unchanged ● Delete cache manually
  • 24.
    Current state ofHipHop ● HHVM v2.2.0 just released ● Very close to PHP 5.4 ● Dozens of extensions ● Performance nearly 5x ● Goal: Support top 20 frameworks in 2013
  • 25.
    Framework Support Framework %Unit Tests Pass Framework % Unit Tests Pass Facebook PHP SDK 100 CodeIgniter 81 Paris9 100 Assetic 80 Idiorm9 100 Twig 78 Slim 99 Wordpress 76 Drupal 98 phpBB 0 Composer 97 CakePHP 0 Laravel 95 Joomla 0 yii 92 PHPMyAdmin 0 Symfony 91 zf2 0 PHPUnit2 90 Doctrine 0 Magento 0 http://www.hhvm.com/blog/875/wow-hhvm-is-fast-too-bad-it-doesnt-run-my-code
  • 26.
    Why is itopen source? Will it last? ● Under PHP license, hard to separate ● Public activity slowed in 2011 ● Under active public development in 2012-13 ● Dev team is active on IRC (freenode #hhvm)
  • 27.
    Facebook's Commitment “In yearspast we've had a few examples of projects which have not been well supported, but we are now much better at growing and sustaining community projects, including, lately, in mobile. [HipHop for PHP] is absolutely a project that we stand strongly behind… stay tuned.” James Pearce, Head of Developer Advocacy at Facebook
  • 28.
    References ● ● ● ● ● Special thanks tothe HipHop for PHP team! https://www.facebook.com/hphp Twitter: @HipHopVM http://www.hhvm.com/ Sebastian Bergmann – Static Code Analysis with HipHop http://sebastian-bergmann.de/archives/918-Static-Analysis-with-HipHop-for-PHP.html http://www.slideshare.net/nickgsuperstar/static-analysis-for-php https://github.com/sebastianbergmann/hhvm-wrapper Haiping Zhao – HipHop Compiler for PHP? Transforming PHP into C++ http://www.youtube.com/watch?v=p5S1K60mhQU Sara Golemon – Scaling with HipHop http://www.youtube.com/watch?v=Dwek7dZDFN0 Ben Foster – Facebook Growth Data http://www.benphoster.com/facebook-user-growth-chart-2004-2010/

Editor's Notes

  • #2 {"5":"154k/second, or 154/sec per server on 1000 servers\n","11":"Facebook was customer\nReduced latency from 20ms (Apache) to 2m\nPeak traffic over 1500 req/sec, load tested at over 10k req/sec per serverCode rebuild took almost 10 minutes per server\nHPHP and Apache shared the same document root\nCompilation of HPHP itself was painful! Super-specific dependencies\n","23":"To use:\nAnalyze:\nhhvm --hphp --target hhbc --input-list <(find -name "*.php") -k1 -l3\nMove in hhvm.hhbc\nRestart server\n","8":"Literally translated PHP code into human-readable C++, preserving class names\nAt Facebook, PHP and C++ are common languages, so this works well\nMany versions of each function may be generated with different parameter types to optimized code\nCompilation at Facebook took 20min (across 100 machines)\n"}