resource proc_open(string command, array descriptor, array pipe)
Функция proc_open (листинг 9.96) предлагает мощное средство выполнения команд в оболочке и выполнения входящих и исходящих потоков. Функция proc_open выполняет команду, указанную в аргументе command, как если бы она была задана непосредственно в командной оболочке.
Массив descriptor предоставляет PHP информацию о выводе на соответствующее стандартное устройство ввода-вывода. Индексами этого массива являются допустимые номера дескриптора. При этом необходимо иметь в виду, что все процессы Unix стартуют с тремя стандартными дескрипторами файлов: 0 - для stdin, 1 - для stdout и 2 - для sterr. Для обмена данными между процессами можно использовать другие номера дескрипторов файлов. 
Значения массива дескриптора должны быть дескриптором файла, созданным функцией fopen, или массивом с описанием нового потока, созданного для вас PHP. Первый элемент этого массива представляет собой строку, описывающую тип, канал или файл. При открытии канала появляется необходимость задавать и второй аргумент для обозначения режима. При открытии файла сначала указывается путь, а затем режим. Режимы аналогичны режимам, используемым функцией fopen, и приведены в табл. 9.4. Следует отметить, что режимы задаются с точки зрения процесса. Поэтому открытие канала в режиме r для процесса будет чтением, что означает, что ваш сценарий будет производить в него запись. Аргумент pipe принимает массив дескрипторов открытого файла. Эти дескрипторы соответствуют дескрипторам, которые можно получить с помощью команды fopen или popen. Завершив процесс, обязательно закройте дескрипторы открытого файла, а затем закройте сам процесс.

Листинг 9.96. Функция proc_open

<?php
$descriptor = array( //ввод процесса (stdin) 0=>array("pipe", "r"), //вывод процесса (stdout) 1=>array("pipe", "w"),
//сообщение об ошибке, отправленное во временный файл (stderr) 2=>array("file", uniqid("/tmp/errors"), "w")
);
//Выполнить CLI PHP
if(!($process = proc_open("php", $descriptor, $pipe))) {
print(" Невозможно запустить процесс!"); exit();
}
// Переслать PHP краткий сценарий $script =
"<?phpn" .
"print('Core PHP<br>');n" . "trigger_error('Проверка stderr');n" . "?>";
fwrite($pipe[0], $script);
// запись в канал завершена, поэтому его нужно закрыть
fclose($pipe[0]);
// прочесть ввод
while(!feof($pipe[1]))
{
//отправить в браузер print(fread($pipe[1], 128));
}
// закрыть канал вывода
fclose($pipe[1]);
//закрыть процесс ($process);

 ?>
integer proc_terminate(resource process, integer signal)
Функция proc_terminate отсылает сигнал открытому процессу. По умолчанию это сигнал SIGTERM. В ОС Windows эта функция вызывает С-функцию TerminateProcess.
putenv(string variable)
Функция putenv устанавливает значение переменной среды. При этом должен ис­пользоваться синтаксис, аналогичный тому, который используется в командной оболочке (листинг 9.97). Для получения значения переменной среды можно использовать функцию getenv или функцию phpinfo для вывода всех переменных среды.

| Листинг 9.97. Функция putenv_
<?php
putenv("PATH=/local/bin;.");
?>

string shell_exec(string command)
Функция shell_exec выполняет команду оболочки и возвращает вывод в виде строки. В аргументе command крайне опасно помещать пользовательскую информацию. Пользователи могут передавать значения в виде полей, позволяющих им выполнять свои собственные команды с помощью вашего Web-сервера. Если необходимо выполнить команду, введенную пользователем, полученную информацию необходимо передавать через функцию escapeshellcmd. Сравните эту функцию с функциями exec, passthru и system.