#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.
Для простой отладки это не имеет большого значения. Для записи «частых» записей журнала на загруженном сайте это означало бы смерть вашего сервера.
Подумайте об этом как о разнице между походом <— к холодильнику за напитком или выходом —> за дверь и кругосветным путешествием только для того, чтобы снова оказаться у холодильника.