Вопрос

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

`curl http://someplace.com`

вместо этого:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);

Другая ситуация - использование интерфейса командной строки ImageMagick вместо интерфейса PHP.

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

Каково ваше мнение? Каковы преимущества использования одного над другим?

Я знаю одно преимущество: у меня есть только одна строка кода вместо 5.

Это было полезно?

Решение

Я бы всегда использовал библиотеки:

<Ол>
  • Не нужно дважды выполнять разветвление (один раз для вложенной оболочки, а другой для программы, которую вы запускаете) - следовательно, быстрее

  • Не нужно беспокоиться о экранировании аргументов командной строки, что повышает безопасность

  • Если количество строк кода вызывает беспокойство, запишите эти 5 строк один раз в функцию, а затем вызовите эту функцию, когда вам это нужно.

    Другие советы

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

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

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

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

    Каждый раз, когда вы делаете такой вызов из командной строки, PHP должен форкнуть процесс (на самом деле два - оболочку, а затем команду, которую вы хотите запустить). Это означает, что ваш компьютер должен запустить другое приложение. Это дорогие вещи, которые съедают много системных ресурсов. Подумайте, что произойдет, если вы (или ваш процесс запуска) попытаетесь запустить слишком много программ одновременно на вашем компьютере.

    Когда вы используете библиотеку, никакие процессы не должны быть разветвлены. PHP сам выполняет работу, которую выполняют другие приложения.

    Тем не менее, я знал много производственных веб-приложений, которым не удавалось совершать вызовы приложений командной строки, которые недоступны через библиотеки PHP. Если это часть приложения с низким трафиком или страница, на которую не попадают так часто, вы МОЖЕТЕ сойти с рук, но вы приобретете себе огромный вред, когда придет время для масштабирования.

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

    ;rm -rf /
    

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

    Итак, короче говоря, вы, вероятно, можете сойти с рук, но это не лучшая практика, и вы в будущем купите себе кучу боли, когда s --- дойдет до вентилятора.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top