note 95207 added to function.proc-open

From: Date: Fri, 18 Dec 2009 15:30:07 +0000
Subject: note 95207 added to function.proc-open
Groups: php.notes 
Request: Send a blank email to php-notes+get-164106@lists.php.net to get a copy of this message
Display output (stdout/stderr) in real time, and get the real exit code in pure PHP (no shell workaround!). It works well on my machines (debian mostly). #!/usr/bin/php <?php /* * Execute and display the output in real time (stdout + stderr). * * Please note this snippet is prepended with an appropriate shebang for the * CLI. You can re-use only the function. * * Usage example: * chmod u+x proc_open.php * ./proc_open.php "ping -c 5 google.fr"; echo RetVal=$? */ define(BUF_SIZ, 1024); # max buffer size define(FD_WRITE, 0); # stdin define(FD_READ, 1); # stdout define(FD_ERR, 2); # stderr /* * Wrapper for proc_*() functions. * The first parameter $cmd is the command line to execute. * Return the exit code of the process. */ function proc_exec($cmd) { $descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w") ); $ptr = proc_open($cmd, $descriptorspec, $pipes, NULL, $_ENV); if (!is_resource($ptr)) return false; while (($buffer = fgets($pipes[FD_READ], BUF_SIZ)) != NULL || ($errbuf = fgets($pipes[FD_ERR], BUF_SIZ)) != NULL) { if (!isset($flag)) { $pstatus = proc_get_status($ptr); $first_exitcode = $pstatus["exitcode"]; $flag = true; } if (strlen($buffer)) echo $buffer; if (strlen($errbuf)) echo "ERR: " . $errbuf; } foreach ($pipes as $pipe) fclose($pipe); /* Get the expected *exit* code to return the value */ $pstatus = proc_get_status($ptr); if (!strlen($pstatus["exitcode"]) || $pstatus["running"]) { /* we can trust the retval of proc_close() */ if ($pstatus["running"]) proc_terminate($ptr); $ret = proc_close($ptr); } else { if ((($first_exitcode + 256) % 256) == 255 && (($pstatus["exitcode"] + 256) % 256) != 255) $ret = $pstatus["exitcode"]; elseif (!strlen($first_exitcode)) $ret = $pstatus["exitcode"]; elseif ((($first_exitcode + 256) % 256) != 255) $ret = $first_exitcode; else $ret = 0; /* we "deduce" an EXIT_SUCCESS ;) */ proc_close($ptr); } return ($ret + 256) % 256; } /* __init__ */ if (isset($argv) && count($argv) > 1 && !empty($argv[1])) { if (($ret = proc_exec($argv[1])) === false) die("Error: not enough FD or out of memory.\n"); elseif ($ret == 127) die("Command not found (returned by sh).\n"); else exit($ret); } ?> ---- Server IP: 195.221.21.36 Probable Submitter: 194.206.220.193 ---- Manual Page -- http://www.php.net/manual/en/function.proc-open.php Edit -- https://master.php.net/note/edit/95207 Del: integrated -- https://master.php.net/note/delete/95207/integrated Del: useless -- https://master.php.net/note/delete/95207/useless Del: bad code -- https://master.php.net/note/delete/95207/bad+code Del: spam -- https://master.php.net/note/delete/95207/spam Del: non-english -- https://master.php.net/note/delete/95207/non-english Del: in docs -- https://master.php.net/note/delete/95207/in+docs Del: other reasons-- https://master.php.net/note/delete/95207 Reject -- https://master.php.net/note/reject/95207 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#164106) next »