[Ayuda] shell_exec y como Correr un programa en segundo plano

Iniciado por agus0, 17 Marzo 2015, 15:04 PM

0 Miembros y 2 Visitantes están viendo este tema.

Pablo Videla

#10
Esto te ayudará.

Código (php) [Seleccionar]
<?php
/* An easy way to keep in track of external processes.
* Ever wanted to execute a process in php, but you still wanted to have somewhat controll of the process ? Well.. This is a way of doing it.
* @compability: Linux only. (Windows does not work).
* @author: Peec
*/
class Proceso{
    private 
$pid;
    private 
$command;

    public function 
__construct($cl=false){
        if (
$cl != false){
            
$this->command $cl;
            
$this->runCom();
        }
    }
    private function 
runCom(){
        
$command 'nohup '.$this->command.' > /dev/null 2>&1 & echo $!';
        
exec($command ,$op);
        
$this->pid = (int)$op[0];
    }

    public function 
setPid($pid){
        
$this->pid $pid;
    }

    public function 
getPid(){
        return 
$this->pid;
    }

    public function 
status(){
        
$command 'ps -p '.$this->pid;
        
exec($command,$op);
        if (!isset(
$op[1]))return false;
        else return 
true;
    }

    public function 
start(){
        if (
$this->command != '')$this->runCom();
        else return 
true;
    }

    public function 
stop(){
        
$command 'kill '.$this->pid;
        
exec($command);
        if (
$this->status() == false)return true;
        else return 
false;
    }
}
?>


ejemplo de prueba

Código (php) [Seleccionar]
 $programa = "/usr/bin/perl script.pl parametros";
            $proceso = new Proceso($programa);


Esperar a que termine por si solo
Código (php) [Seleccionar]

//proceso ejecutando
while($proceso->status()){
           
       }
//proceso finalizado.

Puedes pararlo con los metodos de la clase, saludos.

agus0


MinusFour

Cita de: agus0 en 24 Marzo 2015, 16:30 PM
Muchas Gracias... pero no entendí bien como usar esta Clase

Solo es cuestion de pasarle el comando al constructor y de ahi iniciar o detener el proceso. Sin embargo, la clase de la forma en la que esta escrita, no puede detener el proceso entre peticiones. Tendrias que persistir la ID del proceso de alguna forma. Realmente la idea es la misma que comentaba, necesitas usar kill para enviar SIGTERM a tu proceso corriendo.

Pablo Videla

Cita de: MinusFour en 24 Marzo 2015, 16:56 PM
Solo es cuestion de pasarle el comando al constructor y de ahi iniciar o detener el proceso. Sin embargo, la clase de la forma en la que esta escrita, no puede detener el proceso entre peticiones. Tendrias que persistir la ID del proceso de alguna forma. Realmente la idea es la misma que comentaba, necesitas usar kill para enviar SIGTERM a tu proceso corriendo.

No sería buena idea mantener identificada por session la ID del proceso y matarla cuando el quiera? Es cosa de modificar la clase.

MinusFour

Yo preferiria guardar el proceso en una base de datos o un archivo. Pierdes mucho control sobre la PID si usas sessiones, porque las sessiones pueden expirar, son diferentes para cada usuario/navegador, etc.

Pablo Videla

Cita de: MinusFour en 24 Marzo 2015, 17:30 PM
Yo preferiria guardar el proceso en una base de datos o un archivo. Pierdes mucho control sobre la PID si usas sessiones, porque las sessiones pueden expirar, son diferentes para cada usuario/navegador, etc.

Todo depende de lo que el necesite hacer exactamente.