PHP exec() против system() против passthru()

В чем отличия?

Есть ли конкретная ситуация или причина для каждой функции? Если да, можете ли вы привести некоторые примеры этих ситуаций?

PHP.net говорит, что они используются для выполнения внешних программ. см. ссылку Из примеров, которые я вижу, я не вижу явных различий.

Если бы я просто запускал script (bash или python), какую функцию вы рекомендуете мне использовать?

Ответ 1

У них немного разные цели.

  • exec() для вызова системной команды и, возможно, работы с выводом самостоятельно.
  • system() для выполнения системной команды и немедленного отображения вывода - предположительно, текста.
  • passthru() для выполнения системной команды, от которой вы хотите получить необработанный возврат - предположительно что-то двоичное.

Несмотря на это, я предлагаю вам не использовать ни один из них. Все они производят крайне непереносимый код.

Ответ 2

Как взято из http://php.net/ && Chipmunkninja:

The system() Function

Системная функция в PHP принимает строковый аргумент с командой выполнить так же, как любые аргументы, которые вы хотите передать этой команде. Этот функция выполняет указанную команду и выводит любой полученный текст в выходной поток (либо вывод HTTP на веб-сервере ситуация или консоль, если вы используете PHP в качестве командной строки орудие труда). Возвращение этой функции - последняя строка вывода из программа, если она выводит текст.

The exec() Function

Системная функция довольно полезная и мощная, но одна из Самая большая проблема с этим состоит в том, что весь полученный текст из программы идет прямо к выходному потоку. Будут ситуации, когда вы может форматировать полученный текст и отображать его в некоторых иначе или вообще не отображать.

Для этого отлично работает функция exec в PHP. Вместо автоматический сброс всего текста, сгенерированного исполняемой программой в выходной поток, это дает вам возможность поместить этот текст в массив, возвращенный во втором параметре функции:

The shell_exec() Function

Большинство программ, которые мы выполняли до сих пор, были более или меньше, настоящие программы1. Тем не менее, среда, в которой Windows и Пользователи Unix работают на самом деле гораздо богаче, чем это. Пользователи Windows есть возможность использовать программу командной строки Windows, cmd.exe Эта программа называется командной оболочкой.

The passthru() Function

Одна увлекательная функция, которую предоставляет PHP, похожа на ту, что есть у нас до сих пор видна функция passthru. Эта функция, как и другие, выполняет программу, которой вы говорите. Однако затем он переходит к немедленно отправить необработанный вывод из этой программы в выходной поток с которым в настоящее время работает PHP (т.е. HTTP на веб-сервере) сценарий или оболочка в версии PHP командной строки).

The proc_open() Function и popen() function

proc_open() похож на popen(), но обеспечивает гораздо большую степень контроля за выполнением программы. cmd - это команда выполнен оболочкой. descriptorspec является индексированным массивом, где ключ представляет номер дескриптора, а значение представляет, как PHP передаст этот дескриптор дочернему процессу. pipes будут установлены на индексированный массив файловых указателей, которые соответствуют концу любого PHP pipes, которые созданы. Возвращаемое значение является ресурсом, представляющим процесс; вы должны освободить его с помощью proc_close(), когда вы покончил с этим.

Ответ 3

Предыдущие ответы кажутся немного запутанными или неполными, поэтому вот таблица различий...

+----------------+-----------------+----------------+----------------+
|    Command     | Displays Output | Can Get Output | Gets Exit Code |
+----------------+-----------------+----------------+----------------+
| system()       | Yes (as text)   | Last line only | Yes            |
| passthru()     | Yes (raw)       | No             | Yes            |
| exec()         | No              | Yes (array)    | Yes            |
| shell_exec()   | No              | Yes (string)   | No             |
| backticks ('') | No              | Yes (string)   | No             |
+----------------+-----------------+----------------+----------------+
  • "Отображает вывод" означает, что он выводит выходные данные в браузер (или вывод из командной строки, если выполняется из командной строки).
  • "Можно получить выходные данные" означает, что вы можете получить выходные данные команды и назначить ее для переменной PHP.
  • "Код выхода" - это специальное значение, возвращаемое командой (также называемое "статусом возврата"). Ноль обычно означает, что он был успешным, другие значения обычно являются кодами ошибок.

Другие разные вещи, о которых нужно знать:

  • Shell_exec() и оператор backticks делают одно и то же.
  • Существуют также proc_open() и popen(), которые позволяют интерактивно читать/записывать потоки с помощью исполняемой команды.
  • Добавьте "2> & 1" к командной строке, если вы также хотите захватывать/отображать сообщения об ошибках.
  • Используйте escapeshellcmd() для экранирования аргументов команды, которые могут содержать проблемные символы.
  • Если передать переменную $ output в exec() для хранения вывода, если $ output не пуст, он добавит новый вывод в него. Поэтому вам может понадобиться сначала сбросить ($ output).

Ответ 4

На самом деле все сводится к тому, как вы хотите обрабатывать выходные данные, которые могла бы вернуть команда, и хотите ли вы, чтобы ваш PHP script дождался завершения программы callle или нет.

  • exec выполняет команду и передает результат вызывающему абоненту (или возвращает его в необязательной переменной).

  • passthru аналогичен функции exec() в том, что он выполняет команду. Эта функция должна использоваться вместо exec() или system(), когда вывод команды Unix представляет собой двоичные данные, которые необходимо передать непосредственно в браузер.

  • system выполняет внешнюю программу и отображает вывод, но только последнюю строку.

Если вам нужно выполнить команду и все данные из команды, переданной напрямую без каких-либо помех, используйте функцию passthru().

Ответ 5

Если вы используете PHP script из командной строки, passthru() имеет одно большое преимущество. Он позволит вам запускать сценарии/программы, такие как vim, dialog и т.д., Позволяя этим программам обрабатывать управление и возвращаться к вашему script только после их завершения.

Если вы используете system() или exec() для выполнения этих сценариев/программ, это просто не сработает.

Gotcha: По какой-то причине вы не можете выполнить less с passthru() в PHP.