Описание производительности и параметров php clearstatcache()

я использую filemtime для снятия отпечатков внешних ресурсов в html, например:

<link rel="stylesheet" href="screen-<?=md5(filemtime('screen.css'));?>.css">

Я заметил значительную задержку между эффективным обновлением и отметкой времени, возвращаемой filemtime, поэтому я добавил clearstatcache() вверху, что, похоже, решает проблему. Но согласно руководству по php:

вам нужно вызвать clearstatcache() только в том случае, если вы выполняете несколько операций с одним и тем же именем файла и хотите, чтобы информация об этом конкретном файле не кэшировалась.

Поэтому мне интересно, правильно ли я его использую.

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


clearstatcache также принимает два дополнительных параметра, но я не уверен в их значении:

clear_realpath_cache Нужно ли очищать кеш реального пути или нет.

имя файла Очистить реальный путь и кеш статистики только для определенного имени файла; используется только в том случае, если значение clear_realpath_cache равно TRUE.

Я не понимаю, что означает «кеш реального пути», и я не смог найти никакой информации об этом. Имеет ли смысл вызывать clearstatcache таким образом:

clearstatcache(true,'/path/to/screen.css');

с намерением очистить только информацию, относящуюся к этому конкретному файлу (и, следовательно, уменьшить «влияние» clearstatcache)?


person Giona    schedule 28.11.2012    source источник
comment
Есть ли причина, по которой вы используете md5(filemtime('screen.css')) вместо filemtime('screen.css')? 128-битный хэш 32-битного числа по-прежнему так же хорош, как базовое 32-битное число.   -  person jedwards    schedule 28.11.2012
comment
@jedwards Просто из-за крутости наличия цифр И букв ;-) но вы правы, с точки зрения производительности   -  person Giona    schedule 28.11.2012
comment
вы всегда можете сделать что-то вроде dechex(filemtime('screen.css')) или даже str_pad(dechex(filemtime('screen.css')), 8, '0', STR_PAD_LEFT) -- просто идея   -  person jedwards    schedule 28.11.2012
comment
@jedwards dechex, кажется, выводит действительно похожие строки: 50b149a2, 50b152ba, 50b51803 ... в то время как хэш-функции дискового кэша Firefox могут генерировать коллизии для URL-адресов, которые отличаются незначительно, а именно только на 8-символьных границах (от рекомендации Google ) ... поэтому мне нужна более длинная и разнообразная строка   -  person Giona    schedule 28.11.2012
comment
Ах, достаточно справедливо. Ссылка тоже интересная - спасибо.   -  person jedwards    schedule 28.11.2012
comment
Giona, в ссылке Google сейчас нет ссылки на это. Интересно, эта ошибка Firefox давно устранена?   -  person Simon East    schedule 18.08.2017


Ответы (3)


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

Когда вы include('somefile'), somefile могут находиться в нескольких разных местах, что определяется такими вещами, как ваш include_path, cwd и т. д. Кэш реального пути просто устраняет необходимость многократного поиска этих мест.

Для вашего использования ваш код выглядит нормально.

person jedwards    schedule 28.11.2012
comment
Спасибо за ваш ответ. Хм, тогда я должен использовать общий clearstatcache() или clearstatcache(true,anyfileneeded)? - person Giona; 28.11.2012
comment
Скорее всего, я бы использовал общую функцию clearstatcache(). Единственное исключение было бы, если бы я выполнял гораздо больше статистических функций, которые я делал закешировать. - person jedwards; 28.11.2012

$clear_realpath_cache относится к вызовам функции realpath, результаты которых также кэшируются. . Это не должно влиять на ваши вызовы filemtime.

person Simon    schedule 28.11.2012
comment
Большое спасибо. У вас есть идеи, почему параметр имени файла используется только в том случае, если значение clear_realpath_cache равно TRUE, но он очищает реальный путь И кеш статистики только для определенного имени файла...? - person Giona; 28.11.2012

Я не могу дать ответ прямо.

Но я предлагаю вам использовать md5_file('screen.css') вместо md5(filemtime('screen.css')).

person pensz    schedule 28.11.2012
comment
Я не знаю об этом. Два фрагмента делают очень разные вещи. Второй принимает хэш 32-битного целого числа. Первый принимает хэш всего файла. Первое почти обязательно требует больше работы. (Хотя я не понимаю, почему filemtime('screen.css') недостаточно) - person jedwards; 28.11.2012