Recipe 23.19. Reading Standard Error from a Program

23.19.1. Problem

You want to read the error output from a program; for example, you want to capture the system calls displayed by strace(1).

23.19.2. Solution

Redirect standard error to standard output by adding 2>&1 to the command line passed to popen( ). Read standard output by opening the pipe in r mode. This is shown in Example 23-47.

Reading standard error

<?php $ph = popen('strace ls 2>&1','r') or die($php_errormsg); while (!feof($ph)) {     $s = fgets($ph)               or die($php_errormsg); } pclose($ph)                       or die($php_errormsg); ?>

23.19.3. Discussion

In both the Unix sh and the Windows cmd.exe shells, standard error is file descriptor 2, and standard output is file descriptor 1. Appending 2>&1 to a command tells the shell to redirect what's normally sent to file descriptor 2 (standard error) over to file descriptor 1 (standard output). fgets( ) then reads both standard error and standard output.

This technique reads in standard error but doesn't provide a way to distinguish it from standard output. To read just standard error, you need to prevent standard output from being returned through the pipe. This is done by redirecting it to /dev/null on Unix and NUL on Windows, as in Example 23-48.

Redirecting standard output

<?php // Unix: just read standard error $ph = popen('strace ls 2>&1 1>/dev/null','r') or die($php_errormsg); // Windows: just read standard error $ph = popen('ipxroute.exe 2>&1 1>NUL','r') or die($php_errormsg); ?>

23.19.4. See Also

Documentation on popen( ) at; see your popen(3) manpage for details about the shell your system uses with popen( ); for information about shell redirection, see the Redirection section of the sh(1) manpage on Unix systems; on Windows, see the entry on redirection in the Command Reference section of your system help.

PHP Cookbook, 2nd Edition
PHP Cookbook: Solutions and Examples for PHP Programmers
ISBN: 0596101015
EAN: 2147483647
Year: 2006
Pages: 445

Similar book on Amazon © 2008-2017.
If you may any questions please contact us: