Исключить кеширование документа Excel - PullRequest
0 голосов
/ 10 февраля 2010

У меня есть PHP-скрипт, который просто берет некоторые данные, разделяет их в формате с разделителями табуляции, сохраняет их в виде файла .xls, а затем дает пользователю ссылку для его загрузки.

Большую часть времени работает хорошо, но некоторые люди получают кэшированные версии экспортированного файла .xls.

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

deliver_excel_doc.php? Файл = some_excel_file.xls &

затем delivery_excel_doc.php извлекает данные из документа Excel, но что-то делает с заголовками, чтобы документ Excel не кэшировался, а затем выводил как xls, чтобы файл был загружен (или обработан в Excel ).

Любые идеи о том, как я могу это сделать (жизнеспособна ли эта концепция)?

Ответы [ 3 ]

6 голосов
/ 10 февраля 2010

Вы можете создать версию своего URL, как написали, но вместо этого отправьте соответствующие заголовки:

<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>
3 голосов
/ 10 февраля 2010

Просто добавьте метку времени к ссылке для получения файла Excel, например,

printf('<a href="file.xls?%d">Excel File</a>', time());

Поскольку отметка времени всегда отличается, браузер не будет кэшировать файл.

2 голосов
/ 10 февраля 2010

Если клиенты кэшируют выходные данные вашего PHP, тогда у вас гораздо большая проблема, чем вы думали!

erenon частично прав в правильной настройке инструкций кэширования, однако, если вы предоставите ему дату истечения срока действия кэша, вы обнаружите, что Excel часто не сможет открыть документ (если к нему обращаются через MSIE). Лучшее решение - установить время истечения всего на несколько секунд в будущем и попросить прокси-серверы не кэшировать его:

if ($_SERVER['SERVER_PROTOCOL']=='HTTP/1.0') {
    header("Expires: " . date('r', time()+3));
} else {
    header("Cache-Control: max-age=3, private, must-revalidate");
}

В то время как HTTP / 1.1 будет поддерживать заголовок Expires, для того, чтобы он вел себя так, как ожидалось, часы клиента должны синхронизироваться с часами сервера.

(обратите внимание, что date () выдает предупреждения, если вы не установите часовой пояс)

С * * +1010

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