Debugging PHP Using the MAMP Error Logs

There’s a very simple technique you can use to debug PHP code in web applications run with MAMP in your development environment: write data to the PHP error log. No fancy debuggers or anything, just plain output to the error log. This is how I do it.

First, open your terminal and run the following commands:
1. cd /Applications/MAMP/logs
2. tail -f php_error.log

This will show the last few messages printed in the error log. By running the tail command with the -f flag, new output written to the error log will automatically be shown in your terminal.

Next, use the error_log function in your code to output the variable you want to inspect. This is pretty simple when you want to print a variable with a scalar data type (boolean, integer, float, or string). For example, consider the following PHP code:

$name = "Tomas";
$age = 34;
$likesDogs = true;
$hasDog = false;
$tau = 6.28;

error_log("name: {$name}");
error_log("age: {$age}");
error_log("likes dogs: {$likesDogs}");
error_log("has dog: {$hasDog}");
error_log("tau: {$tau}");

This code will output the following to the error log:

[17-Nov-2018 06:02:23 America/Panama] name: Tomas
[17-Nov-2018 06:02:23 America/Panama] age: 34
[17-Nov-2018 06:02:23 America/Panama] likes dogs: 1
[17-Nov-2018 06:02:23 America/Panama] has dog:
[17-Nov-2018 06:02:23 America/Panama] tau: 6.28

Note the output for the boolean variables. $likeDogs is set to true, and its value is shown in the error log as 1. However, $hasDog is set to false, and no value is actually written to the error log. This is also the case for variables set to null.

Now, let’s consider a more complex data type such as an associative array:

$user = array(
    'name' => 'Tomas',
    'age' => 34,
    'likesDogs' => true,
    'hasDog' => false
);

You might be tempted to simply use error_log like you did earlier:

error_log("user: {$user}");

However, this will actually write a PHP notice to the error log:

[17-Nov-2018 06:14:40 America/Panama] PHP Notice: Array to string conversion in /Applications/MAMP/htdocs/caveman-debugging-sample/index.php on line 23

Not exactly what you were expecting. To actually see the contents of the $user array, you can use either print_r or var_export. Use error_log with print_r as like this:

error_log("user: " . print_r($user, true));

This will print the following on the error log:

[17-Nov-2018 06:19:51 America/Panama] user: Array
(
    [name] => Tomas
    [age] => 34
    [likesDogs] => 1
    [hasDog] => 
)

Or use error_log with var_export like this:

error_log("user: " . var_export($user, true));

which will print the following on the error log:

[17-Nov-2018 06:29:53 America/Panama] user: array (
  'name' => 'Tomas',
  'age' => 34,
  'likesDogs' => true,
  'hasDog' => false,
)

Note that none of these methods actually print out any data types. To get data types printed, you can use good old var_dump combined with ob_start, ob_get_contents, and ob_end_clean to buffer var_dump’s output and prevent it from going directly to the browser:

ob_start();
var_dump($user);
$output = ob_get_contents();
ob_end_clean();

error_log("user: {$output}");

This is basically what print_r and var_export do behind the scenes, but the output you get in the error log is slightly different:

[17-Nov-2018 06:43:55 America/Panama] user: array(4) {
  ["name"]=>
  string(5) "Tomas"
  ["age"]=>
  int(34)
  ["likesDogs"]=>
  bool(true)
  ["hasDog"]=>
  bool(false)
}

And that’s it! Simple caveman-style PHP debugging using the MAMP error logs. No fancy tools with breakpoints or stepping through lines of code, yet still pretty useful.