Является ли fopen fwrite быстрее, чем shell_exec?

#php #unix

#php #unix

Вопрос:

Я хочу записать текст в файл (например, записи журнала / данные / что угодно), где сервер находится в системе unix

быстрее ли использовать:

 $handle = fopen("somefile"); 
fwrite($handle,"sometext");
  

или это:

 shell_exec("echo 'sometext' > somefile");
  

есть ли какие-либо другие недостатки в использовании метода shell_exec?
скорость? безопасность? предварительное исполнение?

Ответ №1:

Для чего-то такого простого, как ваш пример, ни то, ни другое не будет заметно быстрее, и безопасность не является проблемой. Если ваши аргументы оболочки должны быть переменными PHP, то обязательно используйте escapeshellcmd() для них (docs here).

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

Ответ №2:

Намного быстрее. Просто учтите, что shell_exec разветвляется, затем загружает двоичный файл оболочки, запускает его, затем оболочка интерпретирует команду, затем оболочка снова разветвляется для запуска команды …

Ответ №3:

Функции f … () определенно были бы быстрее / безопаснее в долгосрочной перспективе. Даже если вы «всего лишь» выполняете echo, серверу все равно приходится форкать себя, выполнять () оболочку, оболочка должна проанализировать свои аргументы, вызвать echo, а затем ВСЕ равно открыть файл, чтобы записать ваши данные с помощью собственной последовательности fopen / fwrite / fclose.

Для простой отладки это не имеет большого значения. Для записи «частых» записей журнала на загруженном сайте это означало бы смерть вашего сервера.

Подумайте об этом как о разнице между походом <— к холодильнику за напитком или выходом —> за дверь и кругосветным путешествием только для того, чтобы снова оказаться у холодильника.