exec в php с отдельным потоком для ошибок

Можно использовать proc_open + stream_get_contents:

function exec2($cmd, &$stdout=null, &$stderr=null) {
    $proc = proc_open($cmd,[
        1 => ['pipe', 'w'],
        2 => ['pipe', 'w'],
    ], $pipes);
    $stdout = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);
    fclose($pipes[2]);
    return proc_close($proc);
}
published 2020-06-26 13dagger