2009-09-24 88 views

回答

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

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

var_dump($pid); 
+0

「>/dev/null 2>&1&echo $!;」 – andho 2009-09-25 08:48:21

+0

這意味着'將所有輸出發送到空設備,這意味着所有的輸出將在標準輸出中可用,回聲$!簡單地echo PID,這是由腳本 – 2009-09-25 15:33:07

+0

這也意味着,該命令將在後臺運行(這將是你想要什麼,如果你想在PID)拍攝的,所以你的PHP腳本不會等待命令完成執行 – Tofandel 2017-06-15 20:50:51

11

如果你想這樣做,嚴格使用工具PHP給你,而不是Unix-specific wizardry,你可以用proc_openproc_get_status這樣做,雖然需要傳遞一個描述符規範成proc_open使得它令人不快的詳細使用方法:

<?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

這應該是被接受的答案。 – 2017-10-26 14:25:53

0

對於跨平臺解決方案,檢查出symfony/process

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

安裝symfony/process與作曲家(composer require symfony/process)後,您可能需要與composer dump-autoload更新自動加載信息,然後要求自動加載與require __DIR__ . '/vendor/autoload.php';

還要注意的是,你可以得到一個只運行進程的PID。有關API的詳細信息,請參閱the documentation