proc_open

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

proc_open — Виконати команду та відкрити покажчик на файл для введення/виводу

Опис

proc_open(    array|string $command,    array $descriptor_spec,    array &$pipes,    ?string $cwd = null,    ?array $env_vars = null,    ?array $options = null): resource|false

**proc_open()**аналогичнаpopen(), але надає набагато більше контролю за виконанням програми.

Список параметрів

command

Командна до виконання, зазначена як рядок (string). Спеціальні символи повинні бути належним чином екрановані, і застосовувати правильні лапки.

Зауваження: ВWindows, якщо для bypass_shellне установлено значение**trueвoptions command передається в cmd.exe (точніше, %ComSpec%) з прапором /c у вигляді рядка без лапок (тобто точно так, як було задано в proc_open()). Це може призвести до того, що cmd.exeудалит заключающие изcommand(подробности смотрите в документацииcmd.exe**), приводячи до несподіваної та потенційно навіть небезпечної поведінки, тому що повідомлення про помилки cmd.exe можуть містити (частково) переданий параметр command(смотрите Приклад ниже).

Починаючи з PHP 7.4.0, command може передаватися як масив параметрів команди. У цьому випадку процес буде відкритий безпосередньо (не проходячи через оболонку) і PHP подбає про екранування будь-якого необхідного аргументу.

Зауваження :

У Windows екранування аргументу масиву (array) елементів передбачає, що синтаксичний аналіз виконаної команди сумісний із синтаксичним аналізом аргументів командного рядка, що виконуються середовищем виконання VC.

descriptor_spec

Масив, ключі якого є номер дескриптора, а значення визначає, як PHP повинен передати цей дескриптор дочірньому процесу. 0 - stdin, 1 - stdout і 2 - stderr.

Кожен елемент може бути:

  • Масивом, що описує канал (pipe) передачі процесу. Перший елемент – це дескриптор типу, другий – налаштування для обраного типу. Можливі типи:pipe(другий елемент абоrдля передачі процесу сторони каналу для читання, абоwдля передачі сторони запису) таfile(Другий елемент – ім'я файлу). Зверніть увагу, що все, крімw, обробляється якr
  • Ресурс потоку, що представляє дескриптор файлу (наприклад, відкритий файл, сокет,STDIN

Номери дескрипторів не обмежені лише 0, 1 та 2 - ви можете призначити будь-який дійсний номер дескриптора і він буде переданий дочірньому процесу. Це дозволяє скрипту взаємодіяти з іншими скриптами, що працюють як паралельні процеси. Зокрема, таким чином можна передавати дані, що потребують захисту, у програми на зразок PGP, GPG та openssl безпечніше. Також це може виявитися корисним для читання статусної інформації, яку надають ці програми на допоміжних файлових дескрипторах.

pipes

Буде заданий масивом покажчиків на файли, що відповідають створеним каналам передачі PHP.

cwd

Робоча директорія команди. Це має бути абсолютний шлях до директорії або null, якщо потрібно використовувати директорію за замовчуванням (Робоча директорія поточного процесу PHP).

env_vars

Масив змінних оточення для команди, що запускається, або null, якщо потрібно використовувати те саме оточення, що й у поточного PHP-процесу.

options

Дозволяє встановити додаткові параметри. На даний момент підтримуються такі налаштування:

  • suppress_errors(лише для Windows): під час встановлення в**true**не будуть показуватися помилки, що виникають під час роботи функції
  • bypass_shell(лише для Windows): під час встановлення в**true**процес буде запущений в обхід оболонкиcmd.exe
  • blocking_pipes(лише для Windows): примусово блокувати потік під час значення**true**
  • create_process_group(тільки для Windows): дозволити дочірньому процесу оброблятиCTRLподії, якщо встановлено значення**true**
  • create_new_console(лише для Windows): новий процес використовує нову консоль, а не успадковує консоль свого батька

Значення, що повертаються

Повертає ресурс, який представляє процес. Цей ресурс необхідно звільняти функцією proc_close() після завершення роботи з ним. У разі виникнення помилки повертає false

список змін

ВерсияОпис
7.4.4Добавлена опцияcreate_new_consoleв параметрoptions
7.4.0proc_open() тепер також приймає масив (array) у command
7.4.0Добавлена опцияcreate_process_groupв параметрoptions

Приклади

Приклад #1 Приклад використання proc_open()****

Loading...

Висновок наведеного прикладу буде схожим на:

Array
(
    [some_option] => aeiou
    [PWD] => /tmp
    [SHLVL] => 1
    [_] => /usr/local/bin/php
)
команда вернула 0

Приклад #2proc_open()причуда в Windows

Хоча можна очікувати, що наступна програма шукатиме у файлі filename.txt текст search і виводити результати, вона поводиться трохи інакше.

Loading...

Результат виконання наведеного прикладу:

'findstr" "search" "filename.txt' не распознается как внутренняя или внешняя команда,
работающая программа или пакетный файл.

Щоб оминути цю поведінку, зазвичай достатньо передати command у додаткових лапках:

Loading...

Примітки

Зауваження :

Сумісність з Windows: Дескриптори далі 2 (stderr) успадковуються дочірніми процесами, однак відколи Windows не асоціює номери файлових дескрипторів з низькорівневими обробниками, дочірні процеси не мають (поки що) до них доступу. Це не стосується stdin, stdout і stderr.

Зауваження :

Якщо потрібний односпрямований канал процесу, використовуйте функцію popen(), оскільки вона значно простіша у використанні.

Дивіться також

  • popen() - Відкриває файловий покажчик процесу
  • exec() - Виконати зовнішню програму
  • system() - Виконати зовнішню програму та відобразити висновок
  • passthru() - Виконати зовнішню програму та відобразити необроблений висновок
  • stream_select() - Запускає еквівалент системного виклику select() на заданих масивах потоків з часом очікування, вказаним параметрами seconds та microseconds
  • Оператор зворотний апостроф