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

Upgrading PHP

Upgrading PHP

Slide deck for DrupalCampScot and phpDay, although the talks themselves were quite different!

Lorna Mitchell

May 10, 2014
Tweet

More Decks by Lorna Mitchell

Other Decks in Technology

Transcript

  1. About Recent Versions of PHP Version Released End of Life

    5.2 November 2006 January 2011 5.3 June 2009 July 2014 5.4 March 2012 Release + 3 years 5.5 June 2013 Release + 3 years 5.6 Soon Release + 3 years
  2. Not All Upgrades Are Equal • to 5.3: climbing a

    mountain • to 5.4: flying leap • to 5.5: nobody will notice • to 5.6: another anticlimax
  3. PHP Namespaces Namespaces allow modularity and separation • classes, constants

    and functions belong in namespaces • namespaces can be nested • much easier pick-and-mix of frameworks/libraries • avoids naming collision • key ingredient for PSR-0
  4. Namespaced Library File <?php namespace Lorna; class Nonsense { protected

    $words = array("wibble", "squeak", "howl", "pop"); public function speak() { return $this->words[ array_rand($this->words)]; } }
  5. Namespaced Calling Code <?php include 'lorna/nonsense.php'; use Lorna\Nonsense; $nsense =

    new Nonsense(); echo $nsense->speak(); $other = new \StdClass();
  6. Anonymous Functions <?php $things = array("name" => "Alice", "colour" =>

    "Blue", "origin" => "Dreams"); function formatit($value, $key) { echo $key . ": " . $value . "\n"; } array_walk($things, "formatit");
  7. Anonymous Functions <?php $things = array("name" => "Alice", "colour" =>

    "Blue", "origin" => "Dreams"); array_walk($things, function ($value, $key) { echo $key . ": " . $value . "\n"; });
  8. PHP 5.3 is Full of Goodness • namespaces • anonymous

    functions • better DateTime • SPL data structures • works on Windows • E_DEPRECATED error reporting level • late static binding • __DIR__
  9. Upgrading to 5.3: Gotchas new reserved words: namespace, goto log

    message changes requires MySQL > 4.1 full info: http://lrnja.net/ZpvknE (php.net)
  10. PHP 5.4 is a Leap to the Future • improved

    performance, reduced memory footprint
  11. PHP 5.4 is a Leap to the Future • improved

    performance, reduced memory footprint • built-in webserver
  12. PHP 5.4 is a Leap to the Future • improved

    performance, reduced memory footprint • built-in webserver • traits
  13. Simple Traits Example <?php trait Audit { public function getAuditTrail()

    { return "nothing changed"; } } class Princess { use Audit; // General princess class description: // soldering, tree climbing, the usual }
  14. PHP 5.4 is a Leap to the Future • improved

    performance, reduced memory footprint • built-in webserver • short array notation, array dereferencing
  15. Short Array Notation <?php $game[0] = 'paper'; $game[1] = 'scissors';

    $game[2] = 'stone'; $game = array(0 => 'stone', 1 => 'paper', 2 => 'scissors'); $game = [0 => 'scissors', 1 => 'stone', 2 => 'paper'];
  16. PHP 5.4 is a Leap to the Future • improved

    performance, reduced memory footprint • built-in webserver • short array notation, array dereferencing • echo shortcut always available
  17. PHP 5.4 Echo Shortcut PHP 5.4 removes short_open_tag config option

    • <? is never valid • <?= is always valid <p>A template saying "hi, <?php echo $name ?>"</p> <p>is the same as:</p> <p>A template saying "hi, <?=$name ?>"</p>
  18. PHP 5.4 is a Leap to the Future • improved

    performance, reduced memory footprint • built-in webserver • traits • short array notation, array dereferencing • less nonsense
  19. Upgrading to PHP 5.4: Gotchas new reserved words: trait callable

    insteadof no register_globals, short open tag etc turn on E_DEPRECATED on your 5.3 platform compile PHP 5.4 and use the webserver
  20. Upgrading to PHP 5.4: Gotchas new reserved words: trait callable

    insteadof no register_globals, short open tag etc turn on E_DEPRECATED on your 5.3 platform compile PHP 5.4 and use the webserver beware APC issues
  21. Easy Password Hashing <?php $pass = "secretpassword"; $hashed = password_hash($pass,

    PASSWORD_DEFAULT); echo $hashed; $2y$10$Q7Rm.Cmcu4lbvI7.C2q4Z.1LLoh4C63vBSffl
  22. Easy Password Hashing <?php $existing_hash = '$2y$10$Q7Rm.Cmcu4lbvI7.C2q4Z.1LLoh4C $pass = "secretpassword";

    if(password_verify($pass, $existing_hash)) echo "All good"; else echo "Go away"; For PHP < 5.5: http://github.com/ircmaxell/password_compat
  23. PHP Generators Simpler than iterators - a function returning a

    sequence of values. <?php function getValues() { // totally trivial example yield "Apple"; yield "Ball"; yield "Cat"; }
  24. PHP Generators Simpler than iterators - a function returning a

    sequence of values. <?php $stuff = getValues(); foreach($stuff as $thing) { echo $thing . "\n"; }
  25. Try/Catch/Finally Finally is a clause that always gets run <?php

    try{ $fp = fopen("textfile.txt", "w+"); // do stuff } catch (Exception $e) { echo "Stuff went wrong"; } finally { // either way, close the file fclose($fp); }
  26. PHP 5.5: New Features • password hashing features • generators

    • try/catch/finally • built-in opcode cache • Turn on opcache.enable and opcache.enable_cli • use APCu https://github.com/krakjoe/apcu
  27. Upgrading to PHP 5.5 • turn on E_DEPRECATED on your

    5.4 platform • compile PHP 5.5 and use the webserver
  28. Variadic Functions Variable parameters with func_get_args() function concatenate($transform) { $string

    = ''; $pieces = func_get_args(); $transform = array_shift($pieces); foreach($pieces as $piece) { $string .= $piece; } return($transform($string)); } echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
  29. Variadic Functions Much cleaner with new syntax: function concatenate($transform, ...$strings)

    { $string = ''; foreach($strings as $piece) { $string .= $piece; } return($transform($string)); } echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
  30. Argument Unpacking Let PHP unpack your args $email[] = "[email protected]";

    $email[] = "Hi there"; $email[] = "Thanks for registering, hope you like it"; // old syntax mail($email[0], $email[1], $email[2]); //new syntax mail(...$email);
  31. Argument Unpacking Let PHP unpack your args $email[] = "Hi

    there"; $email[] = "Thanks for registering, hope you like it"; mail("[email protected]", ...$email);
  32. PHP 5.6: Just Better • variadic functions • argument unpacking

    • import namespaced functions/constants
  33. Import Namespaced Functions For classes: use \Lib\Many\Layers\Thing; $a = new

    Thing(); Now also for functions: include "Lib/Many/Layers/functions.php"; use function \Lib\Many\Layers\deep_func; deep_func();
  34. PHP 5.6: Just Better • variadic functions • argument unpacking

    • import namespaced functions/constants • exponentiation operator
  35. PHP 5.6: Just Better • variadic functions • argument unpacking

    • import namespaced functions/constants • exponentiation operator • phpdbg included
  36. Upgrading to PHP 5.6 • turn on E_DEPRECATED on your

    5.5 platform • compile PHP 5.6 and use the webserver
  37. General Upgrade Plan • check the changelog: http://php.net/ChangeLog-5.php • turn

    on E_DEPRECATED • test with the webserver, run unit tests with new binary • upgrade test platform • pecl extensions will need a reinstall • go for it :)
  38. PHP Version Adoption • Version 5.3 52.1% • Version 5.2

    28.1% • Version 5.4 16.3% • Version 5.5 1.9% • Version 5.1 1.5% (from W3Techs.com, 5 May 2014)
  39. PHP Performance Comparisons Average time to run bench.php on my

    laptop • 5.3.28: 3.92 seconds • 5.4.27: 2.72 seconds • 5.5.11: 2.69 seconds • 5.6.0beta2: 2.36 seconds