2

子プロセスの出力をPHPでキャプチャして操作する必要があります。

私は2つの小さなスクリプトを持っています、parent.phpそしてchild.php

これはのコードですparent.php

    $exe = $_SERVER['_'];
    $command = '/var/www/child.php';

    echo "\nSTART\n";

    $pid = pcntl_fork();

    ob_start();

    echo "\nHELLO\n";

    if ($pid == -1)
        exit("Could not fork");
    else if ($pid)
        pcntl_waitpid($pid, $status);
    else
    {
        $args = array
        (
            "arg1" => 'one',
            "arg2" => 'two',
            "arg3" => 'three'
        );

        pcntl_exec($exe, array($command), $args);
    }

    $content = ob_get_contents();
    ob_end_clean();

    echo "\nEND\n";

    echo $content . "\n";

そしてこれはのコードですchild.php

    echo "\n\tHELLO FROM TEST\n";

    echo "\t"; var_dump($_SERVER['arg1']);
    echo "\t"; var_dump($_SERVER['arg2']);
    echo "\t"; var_dump($_SERVER['arg3']);

さて...これは私の出力です:

START

    HELLO FROM TEST
    string(3) "one"
    string(3) "two"
    string(5) "three"

END

HELLO

しかし、私はこの出力が必要です

START

END

HELLO

    HELLO FROM TEST
    string(3) "one"
    string(3) "two"
    string(5) "three"

これは、従来のバッファ回避策がob_start()機能しない可能性がありますか?

注:出力の順序は重要ではありません。操作のためにキャプチャする必要があります

4

1 に答える 1

3

私は解決策を見つけました。

ストリームバッファを直接操作できるようにするproc_open()関数を使用する必要があります。

echo "\nSTART\n";

$stream = null;

$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w"),
   2 => array("file", "/tmp/error-output.txt", "a")
);

$cwd = '/tmp';
$env = array('some_option' => 'aeiou');

$process = proc_open('/usr/bin/php', $descriptorspec, $pipes, $cwd, $env);

if (is_resource($process))
{
    fwrite($pipes[0], '<?php echo "HELLO FROM TEST"; ?>'); // here directly the code of child.php
    fclose($pipes[0]);

    $stream = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    proc_close($process);
}

echo "\nEND\n";

echo "\n$stream\n";

出力は次のとおりです。

START

END

HELLO FROM TEST
于 2012-07-30T16:04:22.230 に答える