APC 函数
在线手册:中文 英文
PHP手册

apc_store

(PECL apc >= 3.0.0)

apc_store Cache a variable in the data store

说明

bool apc_store ( string $key , mixed $var [, int $ttl = 0 ] )

缓存一个变量到APC中

Note: 与PHP中其他的机制不同,使用apc_store() 存储的变量 在不同的请求之间一直持久存在(直到从缓存系统中移除)。

参数

key

存储缓存变量使用的名称.key是唯一的,所以 两个值使用同一个名称,原来的将被新的值覆盖

var

The variable to store

ttl

生存时间;在缓存中存储varttl秒, 在ttl秒过去后,存储的变量将会从缓存中擦除(在下一次请求时), 如果没有设置ttl(或者ttl0), 变量将一直存活到被手动移除为止,除此之外不在缓存中的可能原因是, 缓存系统使用clear,或者restart等

返回值

成功时返回 TRUE, 或者在失败时返回 FALSE.

范例

Example #1 A apc_store() example

<?php
$bar 
'BAR';
apc_store('foo'$bar);
var_dump(apc_fetch('foo'));
?>

以上例程会输出:

string(3) "BAR"

参见


APC 函数
在线手册:中文 英文
PHP手册
PHP手册 - N: Cache a variable in the data store

用户评论:

danil dot gazizov at gmail dot com (03-Feb-2012 07:49)

Don't save empty arrays and empty values. Sometimes, you can get wrong apc_exists($someKey) result, that this key doesn't exists.

pere dot cil dot remove dot this at wanadoo dot fr (09-Dec-2011 09:49)

Note that caching resources is not possible; even if the apc cache doesn't seems to call the serialize / unserialize functions, that doesn't means that resources can be cached!

Small non-working example:

<?php
// Setter code
$r = fopen( '/tmp/test.txt', 'r' );
var_dump( $r );
apc_store( 'test', $r );
?>

<?php
// Getter code
$d = apc_fetch( 'test' );
var_dump( $d );
echo
fread( $d, 1024 );
?>

var_dump( $d ) returns Resource #n of type (Unknown). The resource is still here, but unavailable.

Dominik Deobald / Interdose (17-Nov-2010 07:17)

It might be interesting to note that storing an object in the cache does not serialize the object, i.e. does not call the __sleep()/__wakeup() or serialize()/unserialize() methods.

TaRaKa (25-Aug-2010 09:32)

Note APC version 3.1.3 there is a bug (http://pecl.php.net/bugs/bug.php?id=16814) that will display a cache slam averted warning for all writes to a cache var that exists. Slam checking can be disabled by setting apc.slam_defense = 0.

eda-qa at disemia dot com (05-Jan-2010 03:40)

Note that the TTL only takes effect when you attempt to access the variable again (at least in my version).  That is, just issuing a new request to a page won't clear outdated items -- you have to call apc_fetch on that specific item.

If you call apc_info after the TTL of an item it will still be listed.

This is important if you are expecting items to be cleared to conserve memory.

sebastian at 7val dot com (10-Mar-2008 08:53)

Note that since APC 3.0.15 or 3.0.16, the time-to-live-feature does not work within the same request (see http://pecl.php.net/bugs/bug.php?id=13331).

JaskaS (01-Mar-2007 02:06)

if you want to store array of objects in apc use ArrayObject wrapper (PHP5).

<?php
$objs
= array();
$objs[] = new TestClass();
$objs[] = new TestClass();
$objs[] = new TestClass();

//Doesn't work
apc_store('objs',$objs,60);
$tmp = apc_fetch('objs');
print_r($tmp);

//Works
apc_store('objs',new ArrayObject($objs),60);
$tmp = apc_fetch('objs');
print_r($tmp->getArrayCopy());

?>

Roberto Spadim (12-Jan-2007 10:11)

be sure that setting FALSE values can be wrong returned from fetch since fetch return FALSE on errors

php at tequilasolutions dot com (03-Nov-2006 11:45)

Seems to be no (easy) way at the to know how old a value fetched is and to check whether it is out of date.

I've made these wrappers so that you can fetch and store values based on a udt returned from get_last_modified_date() which should return a udt of when your data was last changed, and hence needs junking out of the cache.

<?php
function apc_fetch_udt($key){
   
$g = apc_fetch($key);
    if (
$g){
        list(
$udt,$val) = $g;
        if (
get_last_modified_date()<$udt) {
           
$val = unserialize($val);
            return
$val;
        } else {
           
apc_delete($key);
        }
    }
}
function
apc_store_udt($key,$g){
   
$udt = time();
   
$g   = serialize($g);
   
$apc = array($udt,$g);
   
apc_store($key, $apc);
}
?>

Sudhee (30-Oct-2006 12:09)

It should be noted that apc_store appears to only store one level deep.  So if you have an array of arrays, and you store it.  When you pull it back out with apc_fetch it will only have the top level row of keys with nulls as the values of each key.
 
Solution to this, is to serialize the data before storing it in the cache and unserialize it while retrieving from the cache.