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

PHP is Phun (Internet + PHP History / internals + TDD)

PHP is Phun (Internet + PHP History / internals + TDD)

Recap of Phunconference 5.0 with a little bit of Internet / PHP History & TDD on the side.

Nathan Dunn

March 20, 2015
Tweet

More Decks by Nathan Dunn

Other Decks in Technology

Transcript

  1. What is an Unconference? unconference ˈʌnkɒnf(ə)r(ə)ns/ noun noun: unconference; plural

    noun: unconferences 1. a loosely structured conference emphasizing the informal exchange of information and ideas between participants, rather than following a conventionally structured programme of events. 2. "at this unconference, attendees created sessions on the spot, making for an energizing and freewheeling exchange"
  2. What did we conf about? • Testing ◦ TDD/BDD •

    UI/UX/Frontend ◦ AngularJS ◦ UX ◦ Grunt/Gulp • Frameworks ◦ Symphony 2.0 ◦ Zend Fw 3.0 ◦ Laravel • API/SOA • PHP Runtime ◦ HHVM ◦ PHP7 • Data Storage ◦ MongoDB
  3. Workshops • PHP History • Zend Masterclass • Aspect Oriented

    Programming • PHP at Scale • PHP Security • TDD Code retreat
  4. Before there was PHP... • (1962) J.C.R. Licklider of MIT

    poses the ‘Galactic Network’ concept (DARPA) • (1967) ARPANET plan published • (1974) ‘Internet’ term RFC675 (TCP) • (1976) X.25 TTY/ BBSes • (1981) ARPANET expanded to CSNET • (1989) Tim Berners-Lee invents www. • (1989) AARNET (and various regionals) • (1992) NSFNET Interconnect approved • (1995) Commercial traffic restrictions over the NSFNET end, and so begins the age of the internet http://www.internetsociety.org/internet/what-internet/history-internet/brief-history-internet
  5. PHP is born • (1995) 1.0 - "Personal Home Page

    Tools" || PHP Tools ◦ Written in C, interacted via CGI, 17mo to write ◦ HTML + DBs + Web Form libraries for his résumé site ◦ <!-- Code goes here --> (HTML Comments) ◦ Shared code on USENET to fix bugs / write better code ◦ “It doesn’t make sense writing large apps in PHP” ◦ “There are people who actually like programming. I don't understand why they like programming.” ◦ “I don't know how to stop it, there was never any intent to write a programming language” • (1997) PHP 2.0 "PHP/Forms Interpreter" || PHP/FI 2.0 ◦ +Zeev Suraski +Andi Gutmans ◦ Some people really liked it dev team grow-oh-oh’ed ◦ Used really_long_variable_or_function_etc_names to evenly distribute ‘things’ in memory http://en.wikiquote.org/wiki/Rasmus_Lerdorf Rasmus Lerdorf - First developer of PHP
  6. PHP in it’s infancy • (1998) 3.0 - PHP: Hypertext

    Preprocessor (recursive names were a thing) ◦ 60,000 Domains ~1% of the internet (May 1998 Netcraft Survey) ◦ Rewrite of internal parser ◦ Many more developers joining core team ◦ Peaked at ~10% of the interwebs • (2000) 4.0+ Zend Engine ◦ Better performance, Sessions, Security, Basic OOP ◦ PEAR (PHP Extension and Application Repository) ◦ PHP Quality Assurance Initiative ◦ $_GET, $_POST, $_SESSION superglobals in 4.1 ◦ CLI in 4.3 https://line.do/history-of-php/r5q4x1/vertical https://line.do/php-evolution/8oq/vertical
  7. PHP - The Wonder Years • (2004) 5.0-5.1 Zend Engine

    2 ◦ Now dozens of developers + dozens more on libs ◦ Re-engineered cores, massive perf. improvements, PDO, Native JSON support ◦ 10M - 100M installs…. > ENTIRE INTERNET 1998 • (2009) 5.3 <-GAF (Unsupported from Jun 2014) ◦ Namespace support, Native closures, Garbage collection of circular references ◦ PHAR, Internationalization extension ◦ 2010 HipHop released, HHVM / Hack developed ◦ > 140 bugs fixed • (2010-11) PHP-FPM, PHP-FIG, Composer, MOAR frameworks ◦ FastCGI Process Manager much faster for websites at scale ◦ PSR code standards developed ◦ Composer developed for dependency management http://www.php-fig.org/
  8. PHP - Adulthood • (2012) 5.4 (Security fixes->June ‘15) ◦

    Performance improvements, less memory usage ◦ Removed some legacy functions • (2013) 5.5 (Supported till June ‘16) ◦ Zend Optimizer+, OpCache default ◦ Generators (more memory efficient iteration) • (2014) 6.0 -> 5.6 (Supported till June ‘17) ◦ POST data memory usage reduced 2-3x ◦ Importing namespaced functions /constants • (2015) PHP7 ◦ PHP7-RC -> Jun 2015 ◦ HHVM/Hack Mature ◦ Both strongly typed!!! :D ◦ First PHP Australia conference http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design
  9. PHP7 (php-ng) • Feature freeze -> RC -> June 2015

    • MUCH faster at the core engine level • True 64bit support • Large string / LFS • Supports strong typing • EngineException (Fatals, non-object refs) • ?? null-coalesce operator • Deprecate PHP4 eregs • Unicode escaping, true Internationalization • Lower memory consumption • php-ng execution (CPU) outperfoms HHVM in many cases… in spite of no JIT! http://zsuraski.blogspot.com.au/2014/07/benchmarking-phpng.html https://github.com/php/php-langspec
  10. PHP Under the hood • Interpreted, compiled to tokens &

    OpCodes • Major bottlenecks often due to DB / MemCache / Redis / Thrift / API • PHP is rarely the bottleneck • VLD - Vulcan Logic Disassembler https://speakerdeck.com/dshafik/phpnw14-php-under-the-hood http://pecl.php.net/package/vld
  11. HHVM / Runtime opt. • Used by many large webapps

    • Supports many PHP libs/fws ◦ phpunit, phpunit-mock-objects ◦ composer, symfony, ZF etc. • Bug-for-bug compatible with PHP~5.6 • Just-in-time (JIT) compilation ◦ 2x interpreted PHP speed ◦ Multiple versions of your code ◦ Repo Authoritative mode +25% ◦ Drop in replacement for PHP-FPM ◦ Performance hit on each sync till spool-up • Hacklang ◦ + type hinting, async functions ◦ - prevents HTML in PHP, globals etc. ◦ Hackification (@types, log, harden) • LTS +1 year after release, 6mo cutover http://ma.ttias.be/hhvm-versus-php-fpm-5-4-and-5-5-performance-comparison/ http://www.slideshare.net/pierrej
  12. Test Driven Development • Write tests first that fail, and

    then make them pass by implementing • A testing mindset forces you to think about the architecture of your system more ◦ Forces you to think about implementation and plan before you write
  13. TDD Workshop • Write Conway’s game of life with TDD

    • Pair programming • Start from scratch every 45 mins
  14. What we learned from the workshop • Planning for testing

    ◦ Decoupling implementation code - i.e. separate rules in Conway’s GOL • Cover requirements from spec instead of chasing coverage • Keep tests as specific as possible
  15. Improving testing • Test readability is important when debugging •

    Tests need to be maintained too, or they become useless and you can’t trust them • Use helper functions to improve readability http://www.agitar.com/downloads/TheWayOfTestivus.pdf
  16. TDD Ping Pong • Get two programmers • One writes

    the tests • The other reads the tests and starts implementing them • No talking! Communicate via tests • The only way you control implementation is through tests • Experiment you can run in your own teams
  17. TDD Ping Pong • Carried out an experiment with Memberships

    team. • Wrote a really simple test for DAO (Python service) and then one of us had to implement this. Watch them implement! • Changes how you write tests when you see someone trying to implement straight from your tests.
  18. TDD Ping Pong • When tests fail people look straight

    for the assert statements. Make meaningful assert statements. Comments help out a lot. assertTrue(log.status == 1) assertEquals( log.status, SubscriptionStatus.SUBSCRIBED.value )
  19. Code Coverage “In computer science, code coverage is a measure

    used to describe the degree to which the source code of a program is tested by a particular test suite.” “If I can’t test it, I don’t trust it” “How many tests are enough?”... “100% test coverage is a really good start”
  20. OMG LOOK 100% TEST COVERAGE function whatsNext($num1,$num2) { $out =

    ''; for ($i = 0; $i < $num1, $i++) { if ($num2 > $num1) { $out .= $num1 . ' then ' . $num2; } } return $out; } function testWhatsNext('test'){ $this->assertEquals(whatsNext(2,1),'1 then 2'); }
  21. Lies, Damned Lies and Code Coverage function whatsNext($num1,$num2) { $out

    = ''; for ($i = 0; $i < $num1, $i++) { if ($num2 > $num1) { $out .= $num1 . ' then ' . $num2; } } return $out; } function testWhatsNext('test'){ $this->assertEquals(whatsNext(2,1),'1 then 2'); } “Code Coverage is a measure of how many lines of code a unit test suite has executed. Not tested. Executed” http://blog.astrumfutura.com/2015/01/lies-damned-lies-and-code-coverage-towards-mutation-testing/
  22. Lies, Damned Lies and Code Coverage “Let’s imagine that you

    have 100% Code Coverage. That’s actually a lie. More specifically, you actually have 100% Line Coverage. PHP_CodeCoverage and XDebug are incapable, at this time, of measuring Statement Coverage, Branch Coverage, and Condition Coverage. Your 100% score is only 25% of the story. Let’s call it 10% because I’m mean and there are other forms of Coverage that I have not mentioned.” • phpunit code coverage inaccurate • Do your tests -really- cover all cases? • How can you be sure? http://blog.astrumfutura.com/2015/01/lies-damned-lies-and-code-coverage-towards-mutation-testing/
  23. Test your tests with Humbug • Mutation testing ◦ Injects

    small defects into code ▪ > to < ▪ != to == ▪ (;i<10;i++) to (;i < 10;i--) ▪ if / else / while etc. ◦ Supports phpunit ◦ Fault tolerant (∞ loops, fatals etc.) • Requires a complete set of test cases (not tests) • Gives a level of assurance that the system won’t break in unforeseen situations (test coverage does not) https://github.com/padraic/humbug
  24. Other PHP Australia Highlights • The Rasmus on PHP •

    Monty on MariaDB vs MySQL • Holistic performance improvement… anything > 100ms is too slow! • QB / Zephir, moar runtime optimisation • Process @Github • Scaling delivery tracking @ Etsy • REST done right • Grunt php-unit • Composing Composer • How to make a PHP virus/worm in 15mins http://www.phpconference.com.au/#speakers