Upgrading PHP

Upgrading PHP

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

D33d8bdd9096c80b8d1acca8d28410b5?s=128

Lorna Mitchell

May 10, 2014
Tweet

Transcript

  1. Pains and Gains of PHP Upgrades Lorna Mitchell, May 2014

  2. 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
  3. Current PHP Installations

  4. Pains of Upgrades • cost (time and money) • risk

  5. Gains of Upgrades • shiny new features • better security

    • better performance
  6. 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
  7. to PHP 5.3

  8. PHP 5.3 is Full of Goodness • namespaces

  9. 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
  10. 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)]; } }
  11. Namespaced Calling Code <?php include 'lorna/nonsense.php'; use Lorna\Nonsense; $nsense =

    new Nonsense(); echo $nsense->speak(); $other = new \StdClass();
  12. PHP 5.3 is Full of Goodness • namespaces • anonymous

    functions
  13. Anonymous Functions <?php $things = array("name" => "Alice", "colour" =>

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

    "Blue", "origin" => "Dreams"); array_walk($things, function ($value, $key) { echo $key . ": " . $value . "\n"; });
  15. 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__
  16. 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)
  17. to PHP 5.4

  18. PHP 5.4 is a Leap to the Future • improved

    performance, reduced memory footprint
  19. PHP Performance

  20. PHP 5.4 is a Leap to the Future • improved

    performance, reduced memory footprint • built-in webserver
  21. PHP's Own Webserver php -S dev.project.local:8080 -t /var/www/cool-project/web -c php-ini.development

    routing.php
  22. PHP 5.4 is a Leap to the Future • improved

    performance, reduced memory footprint • built-in webserver • traits
  23. 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 }
  24. Simple Traits Example <?php $daisy = new Princess(); echo $daisy->getAuditTrail();

  25. PHP 5.4 is a Leap to the Future • improved

    performance, reduced memory footprint • built-in webserver • short array notation, array dereferencing
  26. 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'];
  27. 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
  28. 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>
  29. 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
  30. 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
  31. 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
  32. to PHP 5.5

  33. PHP 5.5: New Features • password hashing features

  34. Easy Password Hashing <?php $pass = "secretpassword"; $hashed = password_hash($pass,

    PASSWORD_DEFAULT); echo $hashed; $2y$10$Q7Rm.Cmcu4lbvI7.C2q4Z.1LLoh4C63vBSffl
  35. 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
  36. PHP 5.5: New Features • password hashing features • generators

  37. PHP Generators Simpler than iterators - a function returning a

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

    sequence of values. <?php $stuff = getValues(); foreach($stuff as $thing) { echo $thing . "\n"; }
  39. PHP 5.5: New Features • password hashing features • generators

    • try/catch/finally
  40. 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); }
  41. None
  42. 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
  43. Upgrading to PHP 5.5 • turn on E_DEPRECATED on your

    5.4 platform • compile PHP 5.5 and use the webserver
  44. to PHP 5.6

  45. PHP 5.6: Just Better • variadic functions

  46. 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");
  47. None
  48. 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");
  49. None
  50. PHP 5.6: Just Better • variadic functions • argument unpacking

  51. Argument Unpacking Let PHP unpack your args $email[] = "a@example.com";

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

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

    • import namespaced functions/constants
  54. 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();
  55. PHP 5.6: Just Better • variadic functions • argument unpacking

    • import namespaced functions/constants • exponentiation operator
  56. Exponentiation Operator Like pow() but as an operator echo pow(4,3);

    // 64 echo 4 ** 3; //64
  57. PHP 5.6: Just Better • variadic functions • argument unpacking

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

    5.5 platform • compile PHP 5.6 and use the webserver
  59. In Summary

  60. Upgrade, FFS

  61. 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 :)
  62. Any Questions? Contact me • @lornajane • http://lornajane.net

  63. Appendices

  64. 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)
  65. 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