apc_exist () не существует? - PullRequest
       19

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

4 голосов
/ 03 февраля 2012

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

<code><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)); ?>
CACHE INFO: <?php print_r(apc_cache_info()); ?>
FOO: <?php print_r(apc_fetch("foo")); ?>
BAR: <?php print_r(apc_fetch("bar")); ?>
<?php if (apc_exists("bar")) { ?>bar exists!<?php } else { ?>bar does not exist!<?php } ?>

Короче говоря: вы заполняете форму, и введенное значение сохраняется в 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, которая просто глючит и / или не поддерживает функции, которые я пытаюсь использовать?Любые подсказки?

[EDIT]

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

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

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

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

Ответы [ 2 ]

11 голосов
/ 03 февраля 2012
  1. apc_exists доступен для PECL apc> = 3.1.4 http://www.php.net/manual/en/function.apc-exists.php, так что ваша версия APC, вероятно, ниже, но в любом случае это просто булева оболочка, простая функция, которая должна выполнятьто же самое:

    function user_apc_exists ($ key) {return (bool) apc_fetch ($ key);}

  2. в обоих случаях ваш didint предоставляет информацию, для какого кеша использовать, ваш вероятный пользователь хочет:

    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

0 голосов
/ 30 ноября 2018

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

if (!function_exists('apc_exists')) {
  function apc_exists($key) {
        $success = false;
        apc_fetch($key, $success);
        return  $success;
 }
}
...