PHP библиотека или командная строка? - PullRequest
2 голосов
/ 17 марта 2009

В последнее время я столкнулся с двумя ситуациями, когда я решил использовать командную строку для выполнения чего-либо, а не библиотеку 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.

Ответы [ 3 ]

5 голосов
/ 17 марта 2009

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

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

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

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

2 голосов
/ 17 марта 2009

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

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

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

1 голос
/ 17 марта 2009

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

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

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

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

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

;rm -rf /

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

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

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