Почему я не должен использовать Unix команды из PHP? - PullRequest
6 голосов
/ 22 февраля 2010

Почему вы предпочитаете не использовать команды bash через exec() в php?

Я не рассматриваю проблему переносимости (я определенно не буду портировать ее для запуска в Windows). Это просто вопрос хорошего способа написания сценариев.

С одной стороны:

  1. Мне нужно написать гораздо больше строк в php, чем в bash, чтобы выполнить ту же задачу. Например, когда мне нужно отфильтровать несколько строк в файле, я просто не могу создать образ, используя что-то вместо cat file | grep string > new_file. Это займет гораздо больше времени и усилий, чтобы сделать в php.
  2. Я не хочу анализировать все ситуации, когда что-то может пойти не так. Я просто покажу пользователю вывод команды bash, чтобы он знал, что именно произошло.
  3. Мне не нужно писать другую оболочку для функций файловой системы и использовать ее. Гораздо эффективнее использовать ОС для поиска файлов, манипулирования ими и т. Д.

С другой стороны:

  1. Вызов команды unix с exec() может быть неэффективным в большинстве случаев. Это довольно дорого, чтобы породить отдельный процесс. Речь не идет о скриптах, работающих под Apache, что даже намного менее эффективно, чем порождение из скриптов командной строки.
  2. Иногда это выглядит как «черная магия» и perl-подобные сценарии. Хотя этого можно избежать с помощью подробных комментариев.
  3. Может быть, я просто пытаюсь использовать два разных инструмента вместе, когда они не должны. Каждый инструмент имеет свое собственное приложение и не должен смешиваться вместе.
  4. Хотя я уверен, что пользователи не будут пытаться запускать сценарий в злонамеренных целях, использование exec() является потенциальной угрозой безопасности. В большинстве случаев пользовательские данные могут быть экранированы с помощью escapeshellarg(), но это все еще проблема, которую необходимо учитывать.

Ответы [ 11 ]

0 голосов
/ 22 февраля 2010

Если переносимость на самом деле не является проблемой, потому что вы создаете решение компании, которое всегда будет на ваших собственных, полностью контролируемых серверах, я говорю, что выбирайте команды оболочки столько, сколько захотите. Нет никаких проблем с безопасностью, если вы выполняете правильную базовую очистку, используя escapeshellarg () и consorts.

В то же время, в моих проектах переносимость в большинстве случаев является проблемой, и когда это так, я стараюсь вообще не использовать команды оболочки - только когда что-то вообще не может быть сделано в PHP (например, декодирование / кодирование MP3). , ImageMagick, Video операции) или нет (т. Е. Решение на основе PHP слишком медленное) я буду использовать внешние команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...