apc_exist()不存在?

时间:2012-02-03 08:48:02

标签: php caching apc

我很难让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()永远不会清除缓存(输入后始终显示“bar”)。如果我提供"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()不会返回任何内容......

2 个答案:

答案 0 :(得分:11)

  1. apc_exists可用于PECL apc&gt; = 3.1.4 http://www.php.net/manual/en/function.apc-exists.php所以你的APC版本可能低得多,但它基本上只是一个布尔包装器,一个简单的函数应该基本上做同样的事情: / p>

      

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

  2. 在这两种情况下,你的didint提供了使用哪个缓存的信息,你的probaby想要用户:

    apc_clear_cache('user');
    
    apc_cache_info('user);
    
  3. http://www.php.net/manual/en/function.apc-clear-cache.php

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

答案 1 :(得分:0)

我遇到了同样的问题,经过调试后发现,除非存储的数据是布尔假值或空数组,否则汉尼斯答案中的函数将起作用。

在这些情况下也可以使用

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