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.0 | proc_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
- Оператор зворотний апостроф