Почему я не должен использовать команды Unix от php?

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

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

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

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

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

  1. Вызов Unix управляет с exec() могло бы быть неэффективным в большинстве случаев. Довольно дорого породить отдельный процесс. Не говоря о сценариях, работающих под апачем, который еще намного менее эффективен, чем порождение из сценариев командной строки.
  2. Иногда это оказывается 'подобными черной магии' и подобными perl сценариями. Хотя этого можно избежать с помощью подробных комментариев.
  3. Возможно, я просто пытаюсь использовать два различных инструмента вместе, когда они, как не предполагается. Каждый инструмент имеет свое собственное приложение и не должен быть смешан.
  4. Даже при том, что я уверен, что пользователи не попытаются запустить скрипт, будет злонамеренные цели, с помощью exec() потенциальная угроза нарушения безопасности. В большинстве случаев с пользовательскими данными можно оставить escapeshellarg(), но это - все еще проблема для принятия во внимание.
6
задан altern 23 February 2010 в 11:18
поделиться

11 ответов

Лично, если портативность не является проблемой, я бы полностью использовал команды * nix, такие как grep, locate и т.д. в любое время, пытаясь дублировать эту функциональность в PHP.

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

-121--4091897-

Барабаны часто синтезируются короткими всплесками шума, например белого , розового или коричневого шума.

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

-121--4407284-

Чего вы пытаетесь добиться? PHP имеет функции на основе regex, чтобы найти то, что вам нужно из файла. Да, вам, вероятно, понадобится около 5 строк кода, чтобы сделать это, но, вероятно, это будет не более или менее эффективно.

Основная причина, препятствующая использованию exec () в PHP, заключается в безопасности. Если вы доверяете своему пользователю команду exec () в bash, он может легко выполнять вредоносные команды, такие как установка и запуск фоновых троянов, удаление файлов и т.п.

Однако, пока вы осторожны (используйте команды shell escaping, чтобы очистить пользовательский ввод, ограничить пользовательские разрешения Apache и т.д.), это не должно быть проблемой. Я просто работаю над полной платформой в данный момент, которая опирается на внешние процессы выполнения оболочки просто потому, что C++ намного быстрее, чем PHP, поэтому я написал много бэкэнд-логики как shell-приложение и сохранить PHP для внешней логики.

10
ответ дан 8 December 2019 в 02:26
поделиться

Даже если вы говорите, что переносимость не является проблемой, вы никогда не знаете наверняка, что нас ждет в будущем, поэтому я рекомендую вам пересмотреть эту позицию. Например, меня однажды попросили перенести редактор, написанный (кем-то другим) из Unix в DOS. Исходная программа не предполагалась для портирования и была написана со специфическими вызовами Unix, глубоко встроенными в код. Проверив объем необходимой работы, мы отказались от этой задачи, поскольку она требует слишком много времени.

Я использовал вызовы exec в PHP; однако у меня не было другого способа выполнить то, что мне было нужно (мне пришлось вызвать другую программу, написанную на другом языке, без другого моста между языками). Однако IMO, вызовы exec, которые не нужны, уродливы. Как уже говорили другие, они также могут создавать риски для безопасности и замедлять работу вашей программы.

Как вы сами сказали, вам нужно хорошо документировать вызовы exec, чтобы быть уверенными, что они будут понятны программистам. Зачем создавать лишнюю работу? Не только сейчас, но и в будущем, когда любые изменения в вызове exec также необходимо будет документировать.

Наконец, я предлагаю вам немного лучше изучить PHP и его функции. Я не очень хорошо разбираюсь в PHP, но всего за несколько минут с Google и php.net , я думаю, что сделал то же самое, что вы привели в качестве примера:

$search_results = preg_grep($search_string, file($file_name));
foreach ($search_results as $result) {
    echo $result . "\n";
}

Да, это немного больше кода, но не так много, и вы можете поместить его в функцию, если это необходимо ... и я не удивлюсь, если гуру PHP сможет его сократить.

4
ответ дан 8 December 2019 в 02:26
поделиться

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

`rm -rf /`

(С обратными знаками) на вход, ваш bash-код может фактически взорвать сервер (или по крайней мере что-то взорвать).

это в основном религиозная вещь, большинство разработчиков стараются писать код, который всегда работает. полагаться на внешние команды - верный способ заставить ваш код не работать на некоторых системах (даже на той же самой ОС).

14
ответ дан 8 December 2019 в 02:26
поделиться

IMHO, основная проблема при использовании exec () для выполнения команд * nix через PHP - это безопасность, больше, чем производительность или даже стиль кода.

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

3
ответ дан 8 December 2019 в 02:26
поделиться

Многие люди обрушат на вас тонну кирпичей за то, что вы хотя бы упомянули об использовании exec. Некоторые сочтут это богохульством, но не я. Я не вижу ничего плохого в использовании exec в некоторых ситуациях, если ваш сервер был правильно настроен. Однако недостатком является то, что вы порождаете еще один процесс.

1
ответ дан 8 December 2019 в 02:26
поделиться

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

1
ответ дан 8 December 2019 в 02:26
поделиться

Он не безопасен, если вы не примете чрезвычайные меры предосторожности, чтобы убедиться, что он не может быть использован людьми, выполняющими код.

1
ответ дан 8 December 2019 в 02:26
поделиться

php - плохой исполнитель. php порождает процесс из apache, и если этот процесс зависает, ваш сервер apache зависает, если ваш сайт также работает на том же apache; это не удастся.

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

http://bugs.php.net/bug.php?id=38915

поэтому я не говорю о безопасности, выполнение команд linux с php дает больше сбоев, чем вы думаете, худшая часть использования exec, не всегда возможно вернуть сообщения об ошибках на php. или напишите последующий метод, который зависит от того, что произошло с exec.

рассмотрим этот псевдо-пример:

exec ('bash myscript.sh',$x)
if (myScriptWasOk == true) then do this

Невозможно правильно получить эту переменную myScriptWasOk. Вы просто ничего об этом не знаете, $ x иногда вам поможет.

При всем этом, если вам нужно что-то простое, и если вы протестировали свой скрипт, и он работает нормально, просто сделайте это.

1
ответ дан 8 December 2019 в 02:26
поделиться

Если вы нацелены только на совместимость с Unix (что совершенно нормально), я не вижу в этом ничего плохого. Практически все доступные сегодня серверные операционные системы являются клонами Unix, за исключением, конечно, Windows, которую я считаю нелепым использовать в качестве серверной платформы в первую очередь (и я говорю из собственного опыта, это не только ненависть Microsoft). Совместимость с Unix - это совершенно законное требование к любому серверу, на мой взгляд.

Единственная реальная причина, по которой я могу избежать этого, - производительность. Вы быстро обнаружите, что выполнение внешних процессов в целом чрезвычайно медленно. Это медленно в C, и это медленно в PHP. Я думаю, что это самая большая реальная, нерелигиозная проблема.

EDIT: О, а что касается проблемы безопасности, то это простой вопрос - убедиться, что вы полностью контролируете переменные, передаваемые операционной системе. Это забота, которую вам в любом случае приходится проявлять при общении между процессами и языками, например, при выполнении SQL-запросов. На мой взгляд, это не является достаточно веской причиной, чтобы не делать что-то, это просто то, что нужно учитывать в данном случае, как и в любом другом.

1
ответ дан 8 December 2019 в 02:26
поделиться

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

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

0
ответ дан 8 December 2019 в 02:26
поделиться

Я нашел клиент TFS « Диспетчер рабочих предметов TFS » с классными функциями (например, представление дерева, ссылки на назначенные рабочие предметы) для сортировки и фильтрации предметов и очень полезной визуализации (очень хорошая панель задач, панель мониторинга).

-121--1529185-

Вы можете установить границу метки через ее базовое свойство CALayer:

#import <QuartzCore/QuartzCore.h>

myLabel.layer.borderColor = [UIColor greenColor].CGColor;
myLabel.layer.borderWidth = 3.0;

Swift 5:

myLabel.layer.borderColor = UIColor.darkGray.cgColor;
myLabel.layer.borderWidth = 3.0;
-121-2015739-

Лично, если переносимость не является проблемой, я бы полностью использовал команды * nix, такие как grep, locate и т.д. в любое время, пытаясь дублировать эту функциональность в PHP

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

1
ответ дан 8 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: