Вопрос

Я хочу создать etag, соответствующий тому, что производит Apache.Как Apache создает свои теги?

Это было полезно?

Решение

Apache использует стандартный формат inode-filesize-mtime.Единственное предостережение заключается в том, что mtime должно быть временем эпохи и дополнено нулями, чтобы оно составляло 16 цифр.Вот как это сделать в PHP:

$fs = stat($file);
header("Etag: ".sprintf('"%x-%x-%s"', $fs['ino'], $fs['size'],base_convert(str_pad($fs['mtime'],16,"0"),10,16)));

Другие советы

Об Etags Apache следует помнить одну вещь: они не очень хорошо работают в кластерах, поскольку включают информацию об индексном дескрипторе, которая может (и, вероятно, будет) различаться на разных машинах в одном кластере.

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

Редактировать:Для людей, которые не знают, что этагs - они просто должны быть значением, которое меняется при изменении содержимого в целях кэширования.Браузер получает etag с веб-сервера, сравнивает его с etag его кэшированной копии, а затем извлекает всю страницу, если etag изменился.

ответ выше (от Криса) работает хорошо, но его можно упростить, используя неявное приведение в sprintf:

sprintf('"%x-%x-%x"', $s['ino'], $s['size'], str_pad($s['mtime'], 16, "0"));

Предлагаемый %016x не работает, поскольку заполнение применяется после преобразования в шестнадцатеричный формат, а не до него.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top