PHP
downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

proc_nice> <proc_close
Last updated: Fri, 02 Jan 2009

view this page in

proc_get_status

(PHP 5)

proc_get_statusGet information about a process opened by proc_open()

Description

array proc_get_status ( resource $process )

proc_get_status() fetches data about a process opened using proc_open().

Parameters

process

The proc_open() resource that will be evaluated.

Return Values

An array of collected information on success, and FALSE on failure. The returned array contains the following elements:

elementtypedescription
command string The command string that was passed to proc_open().
pid int process id
running bool TRUE if the process is still running, FALSE if it has terminated.
signaled bool TRUE if the child process has been terminated by an uncaught signal. Always set to FALSE on Windows.
stopped bool TRUE if the child process has been stopped by a signal. Always set to FALSE on Windows.
exitcode int The exit code returned by the process (which is only meaningful if running is FALSE). Only first call of this function return real value, next calls return -1.
termsig int The number of the signal that caused the child process to terminate its execution (only meaningful if signaled is TRUE).
stopsig int The number of the signal that caused the child process to stop its execution (only meaningful if stopped is TRUE).

See Also



proc_nice> <proc_close
Last updated: Fri, 02 Jan 2009
 
add a note add a note User Contributed Notes
proc_get_status
lytithwyn at gmail dot com
29-Dec-2008 02:51
I have had lots of problems in the past bit trying to kill external commands run by proc_open.

Others have suggested using ps to find the children of the pid returned by proc_get_status, but on my system this doesn't work.  I'm using php-5.2.5 and apache-2.0.59 on linux kernel 2.6.21, and the processes I start with proc_open end up being owned by init (pid 1), not by the pid returned by proc_get_status.

I did notice, however, that the pid's of the processes were always above and very close to the proc_get_status pid.  Using that information, I wrote a little function that takes the name of a command, the starting pid at which to search (which would be the proc_get_status pid), and optionally a search limit as arguments.  It will use ps to list processes owned by apache (you may have to change this user name for your system), and search for the command specified.  The limit tells how far above the starting pid to search.  This will help if the command may have already exited, and you don't want to kill a process from a different session than the one you're working with.

Here's the code:

<?php
function findCommandPID($command, $startpid, $limit = 3)
{
   
$ps = `ps -u apache --sort=pid -o comm= -o pid=`;
   
$ps_lines = explode("\n", $ps);

   
$pattern = "/(\S{1,})(\s{1,})(\d{1,})/";

    foreach(
$ps_lines as $line)
    {
        if(
preg_match($pattern, $line, $matches))
        {
           
//this limits us to finding the command within $limit pid's of the parent;
            //eg, if ppid = 245, limit = 3, we won't search past 248
           
if($matches[3] > $startpid + $limit)
                break;

           
//try to match a ps line where the command matches our search
            //at a higher pid than our parent
           
if($matches[1] == $command && $matches[3] > $startpid)
                return
$matches[3];
        }
    }

    return
false;
}
?>
webmaster at rouen dot fr
09-Jul-2008 08:49
The following function takes an array of shell commands and executes them. It is able to execute up to $nb_max_process at the same time. As soon as one process is terminated, another one is executed. Quite useful if you want to batch process commands on a multi-processor or multi-core environment.

The example below tries to convert to PNG a list of SVG files submitted on the command line (using Inkscape).

(it's quick and dirty but works very well for me)

#!/usr/bin/php
<?php
function pool_execute($commandes,$nb_max_process) {
 
$pool=array();
  for(
$i=0;$i<$nb_max_process;$i++) {
   
$pool[$i]=FALSE;
  }

  while(
count($commandes)>0) {
   
$commande=array_shift($commandes);

   
$commande_lancee=FALSE;
    while(
$commande_lancee==FALSE) {
     
usleep(50000);

      for(
$i=0;$i<$nb_max_process and $commande_lancee==FALSE;$i++) {
        if(
$pool[$i]===FALSE) {
         
$pool[$i]=proc_open($commande,array(),$foo);
         
$commande_lancee=TRUE;
        } else {
         
$etat=proc_get_status($pool[$i]);
          if(
$etat['running']==FALSE) {
           
proc_close($pool[$i]);
           
$pool[$i]=proc_open($commande,array(),$foo);
           
$commande_lancee=TRUE;
          }
        }
      }
    }
  }
}

$fichiers=$argv;
array_shift($fichiers);
$commandes=array();
foreach(
$fichiers as $fichier) {
 
$entree=$fichier;
 
$sortie=basename($fichier,'.svg').".png";
 
$commandes[]='inkscape --file='.escapeshellarg($entree).' --export-area-canvas --export-png='.escapeshellarg($sortie);
}

pool_execute($commandes,4);
strrev xc.noxeh@ellij
05-Jun-2008 08:12
You can NOT rely on pid+1.
You could prefix exec to the command string, this will replace the /bin/sh script with the real thing you want to exec (use only if you don't do 'scary things' like pipes, output redirection, multiple commands, however if you know how they work, go ahead).
If you prefix exec, the /bin/sh process will only start your process, and the PID will be the same.
damien at cyg dot net
13-Jun-2007 01:06
Alternatively, if you're calling a subsequent php script using proc_open, you can have that process echo its own actual PID in the output.
Also, if you go through the /proc filesystem on linux, you can read through /proc/12345 where 12345 is the pid returned by proc_get_status (the pid of the /bin/sh instance) and it will list its child processes within.
andy dot shellam at mailnetwork dot co dot uk
05-Apr-2007 12:16
Further to my previous note, I've found out the PID returned is the PID of the shell (/bin/sh) that then runs the actual command requested.

I've raised this as bug #41003.
andy dot shellam at mailnetwork dot co dot uk
05-Apr-2007 11:58
To the poster above, same here on FreeBSD 6.1, PHP 5.2.1.

To get the correct PID to use for posix_kill I have to add 1 to the PID returned from proc_get_status.

proc_nice> <proc_close
Last updated: Fri, 02 Jan 2009
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites