2009-09-24 4 views

risposta

33
$command = 'yourcommand' . ' > /dev/null 2>&1 & echo $!; '; 

$pid = exec($command, $output); 

var_dump($pid); 
+0

Qual è il significato di ">/dev/null 2> & 1 & echo $ !;" – andho

+0

significa "invia tutto l'output al dispositivo null, il che significa che tutto l'output sarà disponibile nello stdout ed echo $! semplicemente echo il pid, che viene catturato dallo script –

+0

Ciò significa anche che il comando verrà eseguito in background (che sarebbe quello che vuoi se vuoi il pid), e così il tuo script php non aspetterà che il comando finisca in esecuzione – Tofandel

11

Se si vuole fare questo rigorosamente utilizzando strumenti PHP ti dà, piuttosto che Unix-specific wizardry, è possibile farlo con proc_open e proc_get_status, anche se la necessità di passare una specifica descrittore in proc_open rende sgradevole verbose da utilizzare:

<?php 

$descriptorspec = [ 
    0 => ['pipe', 'r'], 
    1 => ['pipe', 'w'], 
    2 => ['pipe', 'w'] 
]; 
$proc = proc_open('yourcommand', $descriptorspec, $pipes); 
$proc_details = proc_get_status($proc); 
$pid = $proc_details['pid']; 

echo $pid; 
+0

Questa dovrebbe essere la risposta accettata. –

0

Per una soluzione multipiattaforma, controlla symfony/process.

use Symfony\Component\Process\Process; 
$process = new Process('sleep 100'); 
$process->start(); 
var_dump($process->getPid()); 

Dopo aver installato symfony/process con il compositore (composer require symfony/process), potrebbe essere necessario aggiornare le informazioni del caricamento automatico con composer dump-autoload e poi richiedere il caricamento automatico con require __DIR__ . '/vendor/autoload.php';.

Si noti inoltre che è possibile ottenere il PID di un solo nel processo. Fare riferimento a the documentation per i dettagli dell'API.