Php - PRO и CON для потоковой передачи VS.написание / кэширование - PullRequest
0 голосов
/ 29 марта 2012

Я много раз сталкивался с этой дилеммой, и мне хотелось бы один раз и навсегда изменить ответ в своей голове.

При создании файлов с помощью PHP, таких как * .zip, * pdf или любой другой, PHPпредоставит вам два варианта работы:

  • запись на диск.

  • поток с заголовками для прямой загрузки.

необходимо учитывать следующее:

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

Практический пример:

Допустим, у меня естьвеб-сайт для загрузки упакованного zip-файла с изображениями.

Если я отправлю zip-файл в потоковом режиме - это, очевидно, будет стоить ЦП (и времени).

Если я запишу на диск - это может быть проблемой безопасности (Предполагая, что кто-то может «сканировать» сайт, как-то найти папку или файлы zip и массово скачать все)

Если я пишу на диск, мне также нужно будет как-то проверить, нужно ли обновлять файлы внутри zipили нет, плюс мне придется проверять целостность файла.

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

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Безопасность не имеет значения , если вы все сделаете правильно .Просто не храните файлы внутри общедоступного рута и не настраивайте свой веб-сервер так, чтобы они не обслуживали эти файлы напрямую.

С этим все зависит от того, что вы хотите.Если вам нужно снова и снова подавать один и тот же почтовый индекс, конечно, имеет смысл один раз сжать его и записать на диск, откуда вы будете его обслуживать в следующий раз.Это простая стратегия кеширования .
Если вам необходимо убедиться, что у вас установлена ​​последняя версия zip-файла, сделайте хэш содержимого каким-либо образом.Например:

  1. список файлов для zip (foo.txt, bar.jpg, baz.doc)
  2. make hash $hash = md5(foo.txt, bar.jpg, baz.doc)
  3. , если $hash.zip еще не существует, создайте его
  4. serve $hash.zip

Это типичная стратегия кэширования, позволяющая избегать дорогостоящих операций снова и снова.

1 голос
/ 29 марта 2012

Если один и тот же идентичный zip-файл будет загружаться несколько раз, имеет смысл кэшировать его (на диске или в другом постоянном хранилище). Если вы включите хэш содержимого zip как часть имени файла (или любого другого идентификатора, под которым вы кэшируете данные), то будет просто увидеть, соответствует ли ваше кэшированное значение тому, что вы хотите обслуживать.

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

...