В php есть замечательное расширение Zend OPcache, которое, как и большинство php акселераторов, кэширует скомпилированный php-байткод, тем самым увеличивая производительность php приложений.
Но что, если у вас на сервере есть php приложение, которое не нужно кэшировать таким образом? Это может быть тестовая инсталляция какого-нибудь фреймворка или CMS, редко используемое приложение, например phpMyAdmin, или что-то подобное.
Для этого в настройках расширения есть опция opcache.blacklist_filename, в которой можно указать путь к файлу, содержащему "черный список" файлов (OPcache blacklist), не требующих кэширования. Кроме того, если вам необходимо исключить целое приложение, то вы можете указать все его файлы, используя шаблоны, например /var/www/phpmyadmin/*.php
Файл черного списка содержит имена файлов, которые не нужно ускорять, по одной записи на строку. Допустимы шаблоны поиска и префиксы.
php.net/manual
A blacklist file is a text file containing the names of files that should not be accelerated, one per line. Wildcards are allowed, and prefixes can also be provided.
zend.com/help
Но почему-то в этих мануалах не указано, что шаблоны поиска (wildcards) работают только в *nix системах. Если вы работаете под Windows, использование символов "*" и "?" приводит к некорректной работе Zend OPcache.
На ВМ с Windows 7 x86 SP1 были установлены Apache/2.4.27 и PHP/7.1.9. При добавлении в файл черного списка строки:
c:\apache\htdocs\pma\*
содержимое папки c:\apache\htdocs\pma\
кэшируется, т.е. наш OPcache blacklist игнорируется. Если же заменить строку на:
c:\apache\htdocs\pma\
то все идет как надо — c:\apache\htdocs\
кэшируется, c:\apache\htdocs\pma\
пропускается.
Также была проведена проверка на популярной сборке XAMPP (Windows 7 x64 SP1, Apache/2.4.23, PHP/7.0.13). В отличии от первого эксперимента, здесь при использовании символа "*" кэш переставал работать вообще и все файлы попадали в черный список.
ВОЗМОЖНО, это связано с приведенным ниже участком кода
/* Resolve path relatively to state and put the real path into state */
/* returns 0 for ok, 1 for error */
CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func verify_path, int use_realpath)
{
/*
...
SOME CODE
...
*/
#ifdef ZEND_WIN32
if (memchr(resolved_path, '*', path_length) ||
memchr(resolved_path, '?', path_length)) {
return 1; /* возврат единицы, как видно из аннотации к функции, означает ошибку */
}
#endif
/*
...
SOME CODE
...
*/
}
Заключение
Таким образом, похоже, что для корректной работы Zend OPcache blacklist в Windows, в нем нельзя использовать символы "*" и "?". Если же нужно исключить какую-либо папку, то нужно просто указать путь к ней, например C:\sites\example.com\public-html\
.