Command-Line Output: Consider Logging Over Streams
When writing command-line applications for PHP, consider using a logger for screen output. This is something I've done with great success in several projects. Producer, for example, uses a very light standard I/O logger class that writes output to STDOUT
and STDERR
resource/stream handles. Every command that generates output uses that standard I/O logger (cf. the issues
command).
This has a couple of advantages:
-
Your command-line code gets stdout/stderr output separation practically for free, using a common PSR-3 interface.
-
If you incorporate that command-line tool into another class, you can easily inject a different PSR-3 logger so that output is captured elsewhere, instead of writing to stdout/stderr. Among other things, that makes it relatively easy to test the output of your command-line code without having to use output buffering.
I think this approach works best for non-interactive commands. If you have to read keyboard input from the user as part of the command, using a logger for output might not make a lot of sense. But if all of the command inputs are handled as options or flags, using a logger for output can be great.
Read the Reddit discussion about this post here.