PHP exec() против system() против passthru()
Какие есть отличия?
Есть ли конкретная ситуация или причина для каждой функции? Если да, можете ли вы привести примеры таких ситуаций?
PHP.net говорит, что они используются для выполнения внешних программ. см. ссылку. Из примеров, которые я вижу, я не вижу никакой очевидной разницы.
Если бы мне нужно было просто запустить скрипт (bash или python), какую функцию вы бы мне порекомендовали использовать?
5 ответов
У них немного разные цели.
exec()
предназначен для вызова системной команды и, возможно, работы с выводом самостоятельно.system()
предназначен для выполнения системной команды и немедленного отображения выходных данных - предположительно, текста.passthru()
предназначен для выполнения системной команды, от которой вы хотите получить необработанный возврат - предположительно что-то двоичное.
Несмотря на это, я предлагаю вам не использовать ни один из них. Все они производят крайне непереносимый код.
Предыдущий ответ казался немного запутанным или неполным, поэтому вот таблица различий...
+----------------+-----------------+----------------+----------------+
| 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).
Как взято с http://php.net/ && Chipmunkninja:
Функция 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(), когда закончите с ним.
На самом деле все сводится к тому, как вы хотите обработать вывод, который может вернуть команда, и хотите ли вы, чтобы ваш PHP-скрипт ожидал завершения программы вызываемого абонента, или нет.
exec
выполняет команду и передает вывод вызывающей стороне (или возвращает ее в необязательной переменной).passthru
похож наexec()
Функция в том, что он выполняет команду. Эта функция должна использоваться вместоexec()
или жеsystem()
когда выходные данные команды Unix представляют собой двоичные данные, которые необходимо передать обратно в браузер.system
выполняет внешнюю программу и отображает вывод, но только последнюю строку.
Если вам нужно выполнить команду и передать все данные из команды обратно без каких-либо помех, используйте passthru()
функция.
Если вы запускаете свой PHP-скрипт из командной строки, passthru()
имеет одно большое преимущество. Это позволит вам выполнять скрипты / программы, такие как vim
, dialog
и т. д., позволяя этим программам управлять и возвращаться к вашему сценарию только после завершения.
Если вы используете system()
или же exec()
чтобы выполнить эти скрипты / программы, это просто не будет работать.
Попался: по какой-то причине вы не можете выполнить less
с passthru()
в PHP.