В этом случае есть два файла 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 ,