2015-10-08 2 views
0

В этом случае есть два файла PHP: stdin.php (дочерний компонент процесса) и proc_open.php (компонент родительского процесса), оба они хранятся в той же папке public_html домена. Существует также Программа X, которая передает данные в stdin.php.Как подключиться к процессу PHP с помощью функции proc_open()?


stdin.php (этот компонент работает)

Это процесс, который не должен быть выполнен Повсеместно в браузере, потому что предназначавшийся получить входные данные от программы X, и обратно его все вверх в файле (с именем stdin_backup). Этот процесс работает, потому что каждый раз, когда вводятся каналы программы X, процесс полностью восстанавливает его. Если этот процесс выполняется с не переданным вводом (например, с его выполнением из браузера), процесс создает файл с именем stdin_error с текстом «ERROR».

Ниже приведена часть кода, поскольку процесс работает (как указано выше). Код, показанный лишь для иллюстрации:

#!/usr/bin/php -q 
<?php 
    // Get the input 
    $fh_stdin = fopen('php://stdin', 'rb'); 

    if (is_resource($fh_stdin)) { 
     // ... Code that backs up STDIN in a file ... 
    } else { 
     // ... Code that logs "ERROR" in a file ... 
    } 
?> 

proc_open.php (этот компонент не работает)

Это процесс, который должен быть выполнен Повсеместно в браузере, и предназначавшийся для ввода ввода в stdin.php, как это делает программа X. Этот процесс терпит неудачу, потому что каждый раз, когда он выполняется, сигнал stdin.php не выполняется: нет файла stdin_error, нет файла stdin_backup, даже файла PHP error_log.

Код:

// Execute a PHP process and pipe input to it 
// - Specify process command 
$process_path = __DIR__ . '/stdin.php'; 
$process_execution_command = 'php ' . $process_path; 

// - Specify process descriptor 
$process_descriptor = array(
    0 => array('pipe', 'r') // To child's STDIN 
); 

// - Specify pipes container 
$pipes = []; 

// - Open process 
$process = proc_open($process_execution_command, $process_descriptor, $pipes); 

if (is_resource($process)) { 
    // - Send data to the process STDIN 
    $process_STDIN = 'Data to be received by the process STDIN'; 
    fwrite($pipes[0], $process_STDIN); 
    fclose($pipes[0]); 

    // - Close process 
    $process_termination_status = proc_close($process); 
} 

Я не уверен, что если команда передается proc_open() правильно, потому что я не нашел примеры для этого случая, и, как упоминалось выше, этот сценарий не удается. Я не знаю, что еще может быть неправильным с proc_open.php.

Кроме того, когда я выполняю процесс proc_open.php, бесконечный цикл производит печать следующую строку снова и снова:

X-Powered-By: PHP/5.5.20 Content-тип: текст/HTML; кодировка UTF =-8


судимого popen('php ' . __DIR__ . '/stdin.php', 'w') вместо этого, и имел exaclty тот же результат: ошибка бесконечного цикла печати и ту же строку выше, нет ошибок, без логов, и никаких сигналов исполнения stdin.php ,

ответ

2

Если я правильно понял ваш вопрос, вы хотите открыть процесс и записать данные в поток этого потока STDIN.Вы можете использовать proc_open функцию для этого:

$descriptors = array(
    0 => array("pipe", "r"), // STDIN 
    1 => array("pipe", "w"), // STDOUT 
    2 => array("pipe", "w") // STDERR 
); 

$proc = proc_open("php script2.php", $descriptors, $pipes); 
fwrite($pipes[0], "Your data here..."); 
fclose($pipes[0]); 

$stdout = stream_get_contents($pipes[1]); 
$stderr = stream_get_contents($pipes[2]); 

fclose($pipes[1]); 
fclose($pipes[2]); 

$exitCode = proc_close($proc); 

Если вы просто хотите тест ваш второй сценарий, это, вероятно, будет проще просто использовать команду оболочки:

$ echo "your data" | php script2.php 

или в качестве альтернативы,

$ php script2.php < datafile.txt 

Update, составляя для редактирования вопроса

При использовании функции popen вы можете открыть процесс для чтения или записи. Это позволяет вам читать поток STDOUT процесса или записывать в поток STDIN (но не оба), если это требование, вам нужно использовать proc_open). Если вы хотите записать в поток STDIN, укажите "w" как 2-й параметр: popen, чтобы открыть процесс написания:

$fh_pipe = popen(
    'php script1.php', 
    'w' // <- "w", not "r"! 
); 

fwrite($fh_pipe, 'EMAIL TEXT') ; 
pclose($fh_pipe); 
Смежные вопросы