apc_exist() не существует?

Мне трудно заставить PHP APC работать. Вот мой тестовый код:

<form>
    <input type="text" name="apc">
    <input type="submit">
</form>
<?php
    apc_store('foo','FOO');
    if (isset($_GET['apc'])) {
        apc_store($_GET['apc'],$_GET['apc']);
    }
?>
<pre>CACHE INFO (USER): <?php print_r(apc_cache_info("user",false)); ?></pre>
<pre>CACHE INFO: <?php print_r(apc_cache_info()); ?></pre>
<pre>FOO: <?php print_r(apc_fetch("foo")); ?></pre>
<pre>BAR: <?php print_r(apc_fetch("bar")); ?></pre>
<pre><?php if (apc_exists("bar")) { ?>bar exists!<?php } else { ?>bar does not exist!<?php } ?></pre>
<?php apc_clear_cache(); ?>

Короче говоря: вы заполняете форму, и вставленное значение сохраняется в APC. Ключ "foo" всегда сохраняется. Вы можете попробовать сохранить «bar», чтобы увидеть, как apc_fetch() работает с недавно добавленным ключом.

Что работает нормально:

  • apc_store()
  • apc_fetch()

Что не так:

  • apc_cache_info() (независимо от того, какие параметры я передаю функции) всегда печатает пустой массив, несмотря на то, что apc_fetch() успешно извлекает данные
  • apc_clear_cache() никогда не очищает кеш ("полоса" всегда отображается после ввода). Это верно как в том случае, если я предоставлю параметр "user", так и оставлю функцию без параметров.
  • вызов apc_exists() приводит к фатальной ошибке: вызов неопределенной функции apc_exists()

На случай, если это будет полезно: я использую Zend Server CE 5.6.0 (свежая установка, завершена полчаса назад) с PHP 5.3.9. То же самое произошло вчера с более старой версией Zend Server CE (с PHP 5.3.5). Я не знаю, какая версия APC поставляется с Zend Server, phpinfo() показывает только, что APC включен. Я на компьютере с Windows (Windows 7 Professional, 32-разрядная версия).

Так. Что здесь не так? Проблемы с моим кодом? Может быть, Zend Server поставляется с более старой версией APC, которая содержит ошибки и/или не поддерживает функции, которые я пытаюсь использовать? Любые подсказки?

[РЕДАКТИРОВАТЬ]

Вдохновленный подсказками, предоставленными @Hannes, я изменил код, добавив:

<?php
    if (!function_exists('apc_exists') {
        function apc_exists($key) { return (boolean)apc_fetch($key); }
    }
?>

Поскольку ошибка не возникает, код переходит к следующей строке, и кеш очищается нормально. Должно быть, именно поэтому он не был очищен в первую очередь.

Тем не менее, apc_cache_info() ничего не возвращает...


person mingos    schedule 03.02.2012    source источник


Ответы (2)


  1. #P1# <блочная цитата> #P2#
  2. в обоих случаях вы не предоставили информацию о том, какой кеш использовать, возможно, вам нужен пользователь:

    apc_clear_cache('user');
    
    apc_cache_info('user);
    

http://www.php.net/manual/en/function.apc-clear-cache.php

http://www.php.net/manual/en/function.apc-cache-info.php

person Hannes    schedule 03.02.2012
comment
Я предоставил такую ​​информацию. Пожалуйста, перечитайте вопрос ;). Это не будет работать независимо от того, передам ли я "user" в качестве параметра или оставлю его по умолчанию (насколько я понимаю, это оба файла opcode + user data). - person mingos; 03.02.2012
comment
Я исправил проблему apc_exists, используя предоставленную вами информацию. Есть какие-нибудь подсказки о apc_cache_info? - person mingos; 03.02.2012
comment
@mingos, это довольно странно, но я никогда не использовал APC на компьютере с Windows, поэтому ошибка могла быть здесь, пожалуйста, запустите этот файл pastebin. com/hGUc2fBF — это APC Backend/Cache Overwiew (логин — apc/apc) - person Hannes; 03.02.2012
comment
Вывод: информация о кеше отсутствует. Похоже, что APC не работает. Это странно, так как apc_store() и apc_fetch() работают нормально o_O РЕДАКТИРОВАТЬ: после просмотра исходного кода я вижу, что сообщение генерируется именно в том случае, если apc_cache_info() ничего не возвращает... Собственно о чем мой вопрос... - person mingos; 03.02.2012
comment
@mingos хорошо, так что я думаю, это связано с установкой apc/php под Windows - не моя область знаний - извините - person Hannes; 03.02.2012

Я столкнулся с той же проблемой и после некоторой отладки обнаружил, что функция в ответе Ханнеса работает, если сохраненные данные не являются логическим значением false или пустым массивом.

Это работает и в тех случаях:

if (!function_exists('apc_exists')) {
  function apc_exists($key) {
        $success = false;
        apc_fetch($key, $success);
        return  $success;
 }
}
person Sami Sallinen    schedule 30.11.2018