PHP – exec () vs system () vs passthru ()

Каковы различия?

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

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

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

Они имеют несколько иные цели.

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

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

Функция system ()

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

Функция exec ()

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

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

Функция shell_exec ()

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

Функция passthru ()

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

Функция proc_open () и функция popen ()

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

Кредиты: http://php.net/ && Chipmunkninja (ссылка не упоминается, потому что она не работает, ошибка 404)

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

 +----------------+-----------------+----------------+----------------+ | 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 | +----------------+-----------------+----------------+----------------+ 
  • «Вывод вывода» означает, что он передает данные в браузер (или вывод командной строки, если выполняется из командной строки).
  • «Can Get Output» означает, что вы можете получить вывод команды и назначить ее переменной PHP.
  • «Код выхода» – это специальное значение, возвращаемое командой (также называемое «статусом возврата»). Ноль обычно означает, что он был успешным, а другие значения обычно являются кодами ошибок.

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

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

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

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

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

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

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

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

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

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