Инвалидация opcache не обновляет статус opcache

Для инвалидации кеша опкода (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 файлов)!

Как воспроизвести:

  1. Установите большое приложение FW (используя ZF2 здесь)
  2. Поместите вышеуказанный файл в корневой каталог приложения.
  3. Запустите приложение (500+ файлов будут кэшированы)
  4. Запустите скрипт, вывод будет похож на:

560 файлов OPcache очищены

В кеше еще 560 файлов

Кто-нибудь может это объяснить? А файлы точно очищены или нет?

PS. Я знаю, что указанное выше можно заменить на opcache_reset(), но на следующем этапе скрипт будет фильтровать определенное подмножество файлов. Он предназначен для очистки кода операции для файлов из одного приложения, даже если на одном сервере запущено несколько приложений. Сброс удалит все эти файлы, что невозможно.


person Jurian Sluiman    schedule 10.05.2014    source источник


Ответы (1)


Opcache не вытесняет недопустимые элементы из памяти — они остаются там до тех пор, пока пул не заполнится, после чего память полностью очищается. Существование недопустимой записи кэша не препятствует повторной загрузке/компиляции файла PHP.

person symcbean    schedule 10.05.2014
comment
Спасибо вам за быстрый ответ. Остаются ли они там до тех пор, пока пул не заполнится, и в этот момент память будет полностью очищена, что означает, что старые элементы останутся в памяти, будут оставаться там, ничего не делая, и когда этот процесс, наконец, достигнет предела памяти, он очистит всю память со всеми действительными предметы тоже пропали? Другими словами; возможно, вообще не стоит очищать кеш для подмножества кеша (т.е. для одного приложения на сервере)? - person Jurian Sluiman; 11.05.2014
comment
Да, это именно то, что это означает. Для большинства веб-сайтов с относительно дешевой оперативной памятью это не проблема, если вы не развертываете их очень часто или не имеете инфраструктуры для переключения серверов и извлечения/нажатия кеша. Но это верно не для всех - если это относится к вам, возможно, вам лучше вернуться к apc. - person symcbean; 11.05.2014
comment
Теперь интересно, если я аннулирую файл foo.php, а затем перезагружу foo.php, чтобы он снова кэшировался, будет ли он помещен в память на то место, где ранее был foo.php, или для этого потребуется другой слот в opcache? А также, есть ли какая-либо дополнительная справочная информация об этом, где я мог бы найти рабочих (надеюсь, не читая исходный код, что, я думаю, будет довольно сложно). - person Jurian Sluiman; 11.05.2014
comment
Почему бы тебе не попробовать и не посмотреть? (Я полагаю, что он будет использовать дополнительный слот). Когда я начал смотреть Zend opcache, исходный код был единственной документацией, теперь он частично документирован на веб-сайте php, но охват далеко не исчерпывающий. - person symcbean; 12.05.2014