исполнение passthru ("кошачий файл") - PullRequest
1 голос
/ 24 июня 2011

Я использую passthru ("cat filepath") в моем скрипте загрузки. Меня беспокоит то, что он может использовать много ресурсов сервера.

В чем разница между прямой связью файла в общедоступном каталоге и загрузкой файла с помощью passthru ("cat filepath") в php?

Ответы [ 3 ]

4 голосов
/ 24 июня 2011

В чем разница между прямой связью файла в публичном каталоге и загрузкой файла с использованием passthru ("cat filepath") в php?

Разница в том, что прямая ссылка на файл не вызывает PHP, в то время как выполнение сценария PHP, который, в свою очередь, запускает cat, вызывает как PHP, так и cat. Это займет умеренное количество дополнительной памяти, но не вызовет нагрузку на сервер в большинстве случаев.

Я использовал readfile (), но эту функцию нельзя использовать для файлов размером более 2 ГБ

Возможно, вы захотите найти лучшее решение, чем в этом случае передавать все содержимое файла через PHP. Найдите поддержку X-Sendfile в своем программном обеспечении для веб-сервера.

3 голосов
/ 24 июня 2011

Не используйте passthru() для этого, вы открываете себя для CLI Injection и производительность ужасна. readfile() существует только для этого.

readfile($filepath);

Существуют небольшие издержки при прохождении через PHP по сравнению с прямой ссылкой, но мы обычно говорим о миллисекундах. Однако браузер не сможет запросить 206 Partial при использовании readfile(), если вы не кодируете его поддержку или не используете что-то вроде PEAR::HTTP_Download.

РЕДАКТИРОВАТЬ: Кажется, вы используете passthru(), потому что, очевидно, readfile() не обрабатывает> 2 ГБ файлов должным образом (у меня никогда не было этой проблемы с readfile(), на самом деле я только что протестировал его с Файл 7,2 Гб и все работало нормально). В этом случае хотя бы экранируйте ваши параметры.

function readfile_ext($filepath) {
  if(!file_exists($filepath))
    return false;

   passthru('cat ' . escapeshellarg($filepath));
   return true;
}
2 голосов
/ 24 июня 2011

Вместо passthru('cat filepath') используйте нативный PHP readfile('filepath'), который имеет лучшую производительность.

Хотя оба метода будут медленнее, чем просто прямая ссылка на файл, поскольку PHP имеет определенные накладные расходы.

...