Для инвалидации кеша опкода (php 5.5) я написал небольшой скрипт. Однако статус говорит мне, что аннулирование не удалось. Как это произошло?
<?php
$scripts = opcache_get_status(true)["scripts"];
$failures = array();
foreach (array_keys($scripts) as $file) {
$result = opcache_invalidate($file, true);
if (!$result) $failures[] = $file;
}
if(count($failures) !== 0) {
exit("Failed to clear OPcache for files " . implode(", ", $failures));
}
echo sprintf("%s OPcache files cleared\n", count($scripts));
$scripts = opcache_get_status(true)["scripts"];
echo sprintf("There are still %s files in the cache", count($scripts));
Теперь это очень простой скрипт (который будет частью Soflomo\Cache). Моя проблема в том, что первое эхо (x файлов OPcache, очищенных для Интернета) печатает тот же номер, что и последнее выражение echo (в кеше все еще есть x файлов)!
Как воспроизвести:
- Установите большое приложение FW (используя ZF2 здесь)
- Поместите вышеуказанный файл в корневой каталог приложения.
- Запустите приложение (500+ файлов будут кэшированы)
- Запустите скрипт, вывод будет похож на:
560 файлов OPcache очищены
В кеше еще 560 файлов
Кто-нибудь может это объяснить? А файлы точно очищены или нет?
PS. Я знаю, что указанное выше можно заменить на opcache_reset()
, но на следующем этапе скрипт будет фильтровать определенное подмножество файлов. Он предназначен для очистки кода операции для файлов из одного приложения, даже если на одном сервере запущено несколько приложений. Сброс удалит все эти файлы, что невозможно.