Как вы делаете etag, который соответствует Apache? - PullRequest
12 голосов
/ 05 сентября 2008

Я хочу сделать etag, который соответствует тому, что производит Apache. Как apache создает свои etags?

Ответы [ 4 ]

9 голосов
/ 05 сентября 2008

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)));
2 голосов
/ 05 сентября 2008

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

1 голос
/ 06 июля 2011

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

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

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

1 голос
/ 05 сентября 2008

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

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

...