With PHP 5.4 out and many production environments still running 5.2 (or older), it's time to paint a clear picture on why everyone should move to 5.3 and 5.4 and how to get code ready for the latest version of PHP. In this talk, we'll migrate an old piece of code using some standard and some very non-standard tools and techniques.
2. Who am I ?
Wim Godden (@wimgtr)
Founder of Cu.be Solutions (http://cu.be)
Open Source developer since 1997
Developer of OpenX, PHPCompatibility, Nginx extensions, ...
Zend Certified Engineer
Zend Framework Certified Engineer
MySQL Certified Developer
Speaker at PHP and Open Source conferences
3. Why vs How
Part 1 : why upgrade ?
Bad reasons :
It's cool to have the latest version
Annoy sysadmins
Oh cool, a new toy !
Part 2 : how to upgrade ?
The nightmare of compatibility
The joy of automation
No miracles here !
4. Show of hands
3 / 4
5.0
5.1
5.2
5.3
5.4
5.5RC1
6.0 (just kidding)
6. 5.3 quick recap
Namespaces ()
Late static binding
Closures
Better garbage collection
Goto
Mysqlnd
Performance gain
7. 5.3 – people are not even using it !
43.5% still on PHP 5.2
No :
Symfony 2
Zend Framework 2
Other frameworks that need namespaces
Problematic for developers
8. PHP 5.4 – what's changed ?
New features
Performance and memory usage
Improved consistency
Some things removed
9. Exciting new things – short array syntax
$yourItems = array('a', 'b', 'c', 'd');
$yourItems = ['a', 'b', 'c', 'd'];
$yourItems = ['a' => 5, 'b' => 3];
10. Exciting new things – function array dereferencing
function getCars()
{
return array(
'Mini',
'Smart',
'Volvo',
'BMW'
);
}
$cars = getCars();
echo $cars[1];
function getCars()
{
return [
'Mini',
'Smart',
'Volvo',
'BMW'
];
}
echo getCars()[1];
11. Exciting new things – Traits
Reuse methods across classes
Classes have no common parent
12. Traits - example
Log output : abcd
trait Logger
{
public function log($data) { echo "Log output : " . $data; }
}
class SomeClass {
use Logger;
}
$someObject = new SomeClass();
$someObject->log('abcd');
13. Traits - example
class SomeClass {
public function log($data) { echo "Log output : " . $data; }
}
$someObject = new SomeClass();
$someObject->log('abcd');
14. Traits – careful !
trait Logger {
private $foo;
}
class SomeClass {
private $foo;
use Logger;
}
will throw E_STRICT !
15. Exciting new things – Webserver
PHP 5.4 has a built-in webserver
Development only !
Handles requests sequentially
Ideal for quick testing
Ideal for unit testing of webservices
16. Webserver – how to
/var/www/php54test/html> php -S localhost:8000
PHP 5.4.15 Development Server started at Sat May 2 00:41:12 2013
Listening on http://localhost:8000
Document root is /var/www/php54test/html
Press Ctrl-C to quit.
/var/www/php54test/html> php -S localhost:8000 -t /var/www/other-path/html
PHP 5.4.15 Development Server started at Sat May 2 00:41:12 2013
Listening on http://localhost:8000
Document root is /var/www/other-path/html
Press Ctrl-C to quit.
/var/www/php54test/html> php -S localhost:8000 bootstrap.php
PHP 5.4.15 Development Server started at Sat May 2 00:41:12 2013
Listening on http://localhost:8000
Document root is /var/www/php54test/html
Press Ctrl-C to quit.
17. Exciting new things – SessionHandler
New session handling class
Groups all methods for session handling :
close()
destroy()
gc()
open()
read()
write()
18. SessionHandler
class MySessionHandler extends SessionHandler
{
public function read($session_id)
{
// Get the session data
}
public function write($session_id, $session_data)
{
// Set the session data
}
...
}
$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();
19. Exciting new things – more session stuff
File upload extension
→ file upload registers in session
→ readable through AJAX calls
New function session_status()
Return values : PHP_SESSION_ACTIVE / PHP_SESSION_NONE
20. Performance and memory usage
Performance : 10 – 30%
How ?
Core optimizations
New internal caches (functions, constants, …)
Better (un)serialization
Inlining often-used code paths
…
Reduced memory usage : up to 50% !
Big impact on large frameworks
Even bigger impact on codebases such as Drupal
21. What else is new ? (1/3)
Binary notation
Decimal : 123
Octal : 0173
Hex : 0x7B
Binary : 0b1111011
Class member access on object instantiation
`$fooObj = new Foo();
echo $fooObj->bar();
echo (new Foo)->bar();
22. What else is new ? (2/3)
class Cat {
private $meows;
function __construct($meows) {
$this->meows = $meows;
}
function __invoke() {
return str_repeat('Meow!', $this->meows);
}
}
$furbal = new Cat(5);
echo $furbal(); // Outputs: Meow!Meow!Meow!Meow!Meow!
Magic method __invoke() :
23. What else is new ? (3/3)
class someClass {
private $someProperty;
function __construct($value) {
$this->someProperty = $value;
}
public function showMeTheMoney() {
return function() { echo '$' . $this->someProperty; };
}
}
$obj = new someClass(5000);;
$func = $obj->showMeTheMoney();
$func(); // Outputs: $5000
$objA = new someClass(5000);
$objB = new someClass(10000);
$func = $objA->showMeTheMoney();
$func(); // Outputs: $5000
$func = $func->bindTo($objB);
$func(); // Outputs: $10000
5.3 :
5.4 :
24. Other changes
Error handling :
5.3 : Parse error: syntax error, unexpected T_STRING, expecting '{' in index.php on line 1
5.4 : Parse error: syntax error, unexpected 'bar' (T_STRING), expecting '{' in index.php on line 1
Array to string conversion :
5.3 : Array
5.4 : Note: Array to string conversion in test.php on line 8
<?= always works (even with short_tags off)
Default charset = UTF8
class foo bar
$var = array();
echo $var;
25. Time to remove !
register_globals
magic_quotes
safe_mode
Removed : Still working :
break $var; break 2;
continue $var; continue 3;
session_register()
session_unregister()
session_is_registered()
→ use $_SESSION
26. More stuff removed
Timezone guessing → date.timezone in php.ini
sqlite extension → use sqlite3
New reserved keywords :
trait
insteadof
callable
28. Upgrade : yes / no
Yes No
Using removed extensions x
Using removed functions x
Need extra performance / reduced memory x
Really need new feature x
No unit tests x
No package available (.rpm, .deb, ...) x
29. Postponing upgrades
End-Of-Life
In the past : we'll see
Now : minor release + 2 = out → EOL
5.5 = OUT → 5.3 = EOL (soon !)
5.6 = OUT → 5.4 = EOL (next year !)
Critical security patches : 1 year
No bugfixes
Framework support
Developer motivation
30. So you want to upgrade...
Option 1 : run your unit tests
Option 2 : visit each page (good luck !) + check error_log
Option 3 : automate it !
31. Back in 2010...
PHP Architect @ Belgian Railways
8 years of legacy code
40+ different developers
40+ projects
Challenge :
migrate all projects from
PHP 5.2.4 (on Solaris)
to
PHP 5.3.x (on Linux)
35. PHPCompatibility
New PHP_CodeSniffer standard
Only purpose : find compatibility issues
Detects :
Deprecated functions
Deprecated extensions
Deprecated php.ini settings and ini_set() calls
Prohibited function names, class names, …
…
Works for PHP 5.0, 5.1, 5.2, 5.3, 5.4 and 5.5
36. PHPCompatibility – making it work
Via GIT :
git clone git://github.com/wimg/PHPCompatibility.git PHPCompatibility
Download from Github :
http://github.com/wimg/PHPCompatibility
Install in <pear_dir>/PHP/CodeSniffer/Standards
Run :
phpcs --standard=PHPCompatibility <path>
37. Important notes
Large directories → can be slow !
Use --extensions=php,phtml
No point scanning .js files
Test PHP 5.4 compatibility → need PHP 5.4 on the system
Static analysis
Doesn't run code
Can not detect every single incompatibility
Provides filename and line number
38. The result
Zend Framework 1.7 app
PHP 5.2 : working fine
PHP 5.3 : fail !
function goto()
No 100% detection
95% automation = lots of time saved !
part 2 look at difficulties you might encounter in upgrading. I'll provide solutions not a magician can't solve everything ;-)
5.3.3 = Debian Squeezy = 12% Wait a second... that means people aren't even on 5.3 ? And there was 3 year gap between the release of 5.2 and 5.3, so 5.3 brought a lot of cool things.