PHP proc_open не работает правильно с Джоном Потрошителем - PullRequest
1 голос
/ 02 февраля 2012

Я пытаюсь запустить Джона Потрошителя из сценария PHP.Я хочу запустить его, а затем контролировать его вывод, реагируя соответственно.Тем не менее, все работает не так, как ожидалось, и результаты, которые я получаю, являются (на мой взгляд) случайными.Я могу представить, что мне чего-то не хватает.

Проблема в том, что выходной поток не производит никакого вывода.Это несколько нормально для Джона - вывод производится, когда пользователь вводит символ с клавиатуры.Итак, я пишу в канал stdin, который я настроил.Однако это не приводит к тому, что Джон производит продукцию.Есть предложения?

Код:

<?php

$descriptorspec = array (
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("file", "/tmp/error-output.txt", "w")   // stderr is a file to write to
);

// JOHN is the full path to the john executable
$command = JOHN . " --nolog --config=" . dirname (JOHN) . "/john.conf working/hashes-job-{$_POST['id']} --pot=working/hashes-job-{$_POST['id']}.pot";// --format=raw-md5";
$process = proc_open ($command, $descriptorspec, $pipes);

if (is_resource ($process)) {
    sleep(5);
    fwrite ($pipes[0], "a\n");
    fflush ($pipes[0]);
    while (!feof ($pipes[1])) {
            // I have tried with the following uncommented as well
            // That led to the while loop exiting prematurely for some reason...
        // stream_set_blocking($pipes[1], false);
        $output = fread ($pipes[1], 4096);
        // stream_set_blocking($pipes[1], true);

        file_put_contents ('/tmp/dpcp-tool-' . time (), $output);
        fwrite ($pipes[0], 'a');
        fflush ($pipes[0]);
        file_put_contents ('/tmp/publishOutcome-' . time (), $reply);
        sleep(5);
    }

    file_put_contents('/tmp/died-' . time(), $entered);
    fclose ($pipes[0]);
    fclose ($pipes[1]);
    $return_value = proc_close ($process);
}
...