Come posso richiamare uno script di shell esterno (o in alternativa uno script PHP esterno) da PHP stesso e ottenere il suo ID di processo all'interno dello stesso script?Richiama lo script di shell esterna da PHP e ottieni l'ID di processo
risposta
$command = 'yourcommand' . ' > /dev/null 2>&1 & echo $!; ';
$pid = exec($command, $output);
var_dump($pid);
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;
Questa dovrebbe essere la risposta accettata. –
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.
Qual è il significato di ">/dev/null 2> & 1 & echo $ !;" – andho
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 –
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