View
9.506
Download
3
Embed Size (px)
DESCRIPTION
A talk I gave at Refresh Cambridge on 1st July, 2009, on PHP Debugging.
Citation preview
The Strange World of Debugging PHP
Refresh Cambridge, 1 July 2009
Simon R Jones, Studio 24www.studio24.net
White screen of death
We’re trying to avoid this
http://www.flickr.com/photos/nebarnix/320901099/
Which makes us feel like this
http://www.flickr.com/photos/sjaek/468245227/
While we’d rather be happilygetting on with development
• What is a bug?
• Common errors
• Error reporting
• Basic debugging techniques
• A proper PHP debugger
• Best practises
Debugging PHP
What is a bug?
• Human error (typos)
• Logic errors
• Environmental errors (files, web service, db)
• And rarely, it’s a system bug (PHP, Apache)!
Common errors
Syntax errors
• Something’s usually in the wrong place..
• T_ENCAPSED_AND_WHITESPACE
Syntax errors
• T_NUM_STRING
• T_OBJECT_OPERATOR
• T_STRING
• T_VARIABLE
• T_PAAMAYIM_NEKUDOTAYIM !(means double colon in Hebrew)
Whose line is it anyway?
• The syntax error isn’t always on the line reported
• Usually the case with missing quotes
Headers already sent
• PHP mime type = text/html
• A single space after a closing ?> will send HTML + headers to the browser
• Don’t include the closing ?> tag (unless you’re outputting HTML)
Error Reporting
Recommended settings
• Hide on screen
• Display friendly error page
• Log errors
Production (live) site
• Display on screen
Development site
Display errors
• Default php.ini setting is to hide errors
• Override in first PHP file
• A gotcha: any syntax errors in this file will ignore these settings
• Error reporting is a bitwise setting
Bitwise operators
• Report all errors..
• But not notices
• And not warnings
• http://php.net/manual/en/function.error-reporting.php
Error types
• Parse error
• Fatal error
• Warning
• Notice
• Strict notice
Error log• Default is to log errors to the Apache ErrorLog location (usually set in a VirtualHost directive)
• A gotcha: this overrides php.ini error_log setting which can be confusing
• Can be overridden with PHP options log_errors and error_log
Custom error reporting
• set_error_handler()
• Set a callback function (or class) to manage errors
• Show nice error page to users on live site
• Email critical errors to the tech team
• http://uk3.php.net/manual/en/function.set-error-handler.php
Throwing errors
• Throw errors in your code (i.e. if a database call fails)
• trigger_error()
• Exceptions in PHP 5
• Always program defensively, don’t assume that database call will always work or a certain field will exist in an external XML file
Supressing errors
• @ operator
• Arrgh, not generally a good idea
• Sometimes a valid use case (i.e. throw an exception on function failure)
• Scream to disable supressed errors!
•ini_set('scream.enabled', 1);
Watch out!Errors suppressed with the @ operator are still sent to a custom error handler. Can cause headaches and unexplained bugs!
Exceptions
• PHP 5 only
• Only classes can throw an exception
• set_exception_handler() to deal with uncaught exceptions
• Uncaught exceptions raise a Fatal error
Pretty Blue Screen
• Nice exception handler from Harry Fuecks
• http://www.sitepoint.com/blogs/2006/04/04/pretty-blue-screen/
Basic debugging techniques
var_dump
• Tracking variables throughout code
• Add formatting:
• Better: Zend_Debug::dump()
Debug window
• Javascript debug window
• http://devzone.zend.com/article/1256
Firebug console logging
• Firebug and FirePHP plugins for Firefox
• Doesn’t send output to HTML page so won’t interfere with sessions, headers, etc
• Zend_Log_Writer_Firebug
• www.getfirebug.com
ZFDebug
• Zend Framework plugin to display debug information (time spent, memory usage, database queries, etc)
• http://jokke.dk/software/zfdebug
A proper debugger
• Step through your code line by line
• Set breakpoints
• View environment, script variables and function paramters at each step
• View browser output
• Profiling
Xdebug
• Open Source
• Packaged with Komodo IDE
• Or via http://www.xdebug.org/
Zend Debugger
• Commercial
• Part of Zend Studio
• Debugging from Firefox or from within Zend Studio
Best practises• Use an IDE with PHP syntax checking
• Enforce coding standards
• Comment your code! (PHPDoc)
• Defensive programming
• Lightweight inital PHP file to help report errors
• Break complex code into smaller chunks (OO)
• Peer review
• Write Unit tests for small, discrete bits of code
• Ensure the staging site is on the same server setup as the live site
Links
• Zend Studio - www.zend.com/studio
• Eclipse + PDT - www.zend.com/en/community/pdt
• Komodo - www.activestate.com/komodo/
• Zend Framework docs - http://framework.zend.com/manual/en/
• Blog article: Debugging development - http://techportal.ibuildings.com/2009/03/16/debugging-development/