apc_store

(PECL apc >= 3.0.0)

apc_storeMet en cache une variable dans le magasin

Description

apc_store ( string $key , mixed $var [, int $ttl = 0 ] ) : bool
apc_store ( array $values [, mixed $unused = NULL [, int $ttl = 0 ]] ) : array

Met en cache une variable en magasin.

Note: Contrairement à tous les autres mécanismes de PHP, les variables stockées en utilisant la fonction apc_store() persistent entre les requêtes (tant que la valeur n'est pas effacée du cache).

Liste de paramètres

key

Stocke la variable en utilisant ce nom. Les clés key sont uniques, donc, stocker une seconde valeur avec la même clé effacera la valeur originale.

var

La variable à stocker.

ttl

Temps de vie : stocke la variable var dans le cache pour ttl secondes. Après que ttl soit passé, la variable stockée sera supprimée du cache (à la requête suivante). Si aucun ttl n'est fourni (ou si le ttl vaut 0), la valeur persistera tant qu'elle ne sera pas effacée manuellement du cache, ou si elle n'existe plus dans le cache (effacement, redémarrage, etc.).

values

Les noms comme clés, les variables comme valeurs.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès ou FALSE si une erreur survient. La seconde syntaxe retourne un tableau avec les clés en erreur.

Exemples

Exemple #1 Exemple avec apc_store()

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

L'exemple ci-dessus va afficher :

string(3) "BAR"

Voir aussi

  • apc_add() - Met en cache une nouvelle variable dans le magasin de données
  • apc_fetch() - Récupère une variable stockée dans le cache
  • apc_delete() - Efface une variable stockée dans le cache

add a note add a note

User Contributed Notes 15 notes

up
18
JaskaS
17 years ago
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());

?>
up
3
sebastian at 7val dot com
16 years ago
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).
up
3
MaxTheDragon at home dot nl
12 years ago
When specifying a ttl (Time-To-Live), you are allowed to use negative values. This causes a stored entry to be invalidated immediately, but note that it will not physically be removed until you read (eg. apc_fetch or apc_exists) it:

<?php
apc_store
('testKey', 'testValue', -1); // ... or any negative integer.

// at this point, the key exists physically but is already technically invalidated by the ttl.

$test = apc_fetch('testKey'); // $test equals false.

// at this point, the key no longer exists physically.
?>

Although you could mimic apc_delete with a negative TTL (like when dealing with cookies), note that the difference is that apc_delete actually physically removes the entry.

This example comes in handy when you want to unit-test a class that uses APC. It's faster to use a negative TTL than a positive in combination with a sleep call to test whether the cache entry has actually been deleted. Other than that I can't think of any situations in which you could use this example, but I'm simply pointing out that doing this will not generate Exceptions or errors.
up
3
alexey dot maksutov at gmail dot com
11 years ago
APC does serialization/deserialization during store/fetch operations as well as it calls __sleep()/__wakeup(), or Serializable::serialize()/Serializable::unserialize(). Tested on PHP 5.4.1.0.
up
1
cycne001 at hotmail dot com
4 years ago
simple implementation with persistence using tmpfs on Linux system

<?php
   
//  Escrito por Renato Martins
   
   
define('MYSHM_PATH', "/dev/shm/.php_myshm");
    @
mkdir(MYSHM_PATH);
       
    function
shm_set($key, $val, $ttl = 0) {
       
$key = md5($key);
        if (
$ttl > 0 ) $ttl = time() + $ttl;
        return
file_put_contents(MYSHM_PATH . "/$key" , serialize([$ttl, $val]) , LOCK_EX);
    }
   
    function
shm_get($key) {
       
$key = md5($key);
       
$f = MYSHM_PATH . "/$key";
       
$v = unserialize(@file_get_contents($f));
        if ( !
$v || ($v[0] > 0 && time() > $v[0]) ) {
            @
unlink($f);
            return
null;
        }
       
        return
$v[1];
    }

   
shm_set('teste', ['a', 222 ,453] , 60);
   
print_rshm_get('teste')  );

?>
up
0
mys5droid at gmail dot com
8 years ago
"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."

This is not a bug. Surprisingly, it has been assigned a bug id.It is obviously not a bug, because there is a man-made error message, as well as a switch to turn off slam checking.

Think about it, would you release code which modifies core system files without warning? No, you would make a warning for the user. Same is true with shared memory.

I happen to think it is a good feature, it tells you are overwriting something... And if you dislike it, turn it off using that setting, or use an @ in front of the function calls...
up
0
brunohass2303 at gmail dot com
11 years ago
Functions to update arrays and get the values from an unique key.

<?php

function apc_array_store($apc_var, $key, $valor)
{
   
$apcTemp = array();
   
    if (
$valor == NULL ) return FALSE;
   
    if (
$apcTemp = apc_fetch($apc_var) ) // Verifica se a variavel $apc_var existe no cache APC
   
{ // Se existir
       
if ( !array_key_exists($apcTemp, $key) ) // Verifica se a chave $key existe no array
           
$apcTemp[$key] = $valor; // Se $valor não for NULL, adiciona no array
       
       
if ( apc_store("$apc_var", $apcTemp) ) // Tenta atualizar o array no cache
            
return TRUE;
        else return
FALSE;
    }
    else
    {
// Se a variavel $apc_var nao existir no cache adiciona
       
if ( $valor == NULL ) // Se $valor for NULL retorna FALSE
           
return FALSE;
        else
        {   
// Se $valor não for NULL, cria o array
           
$apcTemp[$key] = $valor;
           
            if (
apc_add("$apc_var", $apcTemp) ) // Tenta adicionar o array no cache
                
return TRUE;
            else return
FALSE;
        }
    }
   
}

function
apc_array_fetch($apc_var, $key)
{

    if (
$apcTemp = apc_fetch($apc_var) ) // Verifica se a variavel $apc_var existe no cache APC
   
{ // Se existir
       
if ( !array_key_exists($apcTemp, $key) ) // Verifica se a chave $key existe no array
               
return FALSE; // Se não existir retorna FALSE
           
else
                return
$apcTemp[$key]; // Se existir retorna o valor
   
}
    else
// Se não existir
       
return FALSE;
   
}

?>
up
0
danil dot gazizov at gmail dot com
12 years ago
Don't save empty arrays and empty values. Sometimes, you can get wrong apc_exists($someKey) result, that this key doesn't exists.
up
-1
eda-qa at disemia dot com
14 years ago
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.
up
-2
Roberto Spadim
17 years ago
be sure that setting FALSE values can be wrong returned from fetch since fetch return FALSE on errors
up
-1
php at tequilasolutions dot com
18 years ago
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);
}
?>
up
-1
pere dot cil dot remove dot this at wanadoo dot fr
12 years ago
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.
up
-3
Dominik Deobald / Interdose
13 years ago
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.
up
-6
TaRaKa
14 years ago
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.
To Top