Vous pouvez faire ce que vous avez dit, pregenerate un bloc de 1000 valeurs pointant les images que vous allez revenir:
$distribution = "011022201111202102100120 ..." # exactly evenly distributed
stocker ensuite ce bloc dans MySQL et memcache, et utiliser une autre clé (dans les deux MySQL et memcache) pour contenir la valeur d'index actuelle pour la chaîne ci-dessus. Chaque fois que le script d'image est frappé, incrémenter la valeur dans memcache. Si memcache tombe en panne, allez à MySQL à la place (UPDATE, puis SELECT, il pourrait y avoir une meilleure façon de faire cette partie). Pour maintenir syncache et MySQL en synchronisation, vous pourriez avoir un travail cron copier la valeur d'index actuelle de memcache à MySQL. Vous allez perdre de la précision, mais cela peut ne pas être critique dans cette situation.
Vous pouvez stocker plusieurs distributions dans MySQL et memcache et avoir une autre clé qui pointe vers la distribution actuellement active. De cette façon, vous pouvez pré-générer de futurs blocs d'image. Lorsque l'index dépasse la distribution, le script incrémente la clé et passe à la suivante.
En gros:
function FetchImageFname()
{
$images = array(0 => 'image1.jpg', 1 => 'image2.jpg', 2 => 'image3.jpg');
$distribution = FetchDistribution();
$currentindex = FetchCurrentIndex();
$x = 0;
while($distribution[$currentindex] == '' && $x < 10);
{
IncrementCurrentDistribKey();
$distribution = FetchDistribution();
$currentindex = FetchCurrentIndex();
$x++;
}
if($distribution[$currentindex] == '')
{
// XXX Tried and failed. Send error to central logs.
return($images[0]);
}
return($distribution[$currentindex]);
}
function FetchDistribution()
{
$current_distib_key = FetchCurrentDistribKey();
$distribution = FetchFromMemcache($current_distrib_key);
if(!$distribution)
$distribution = FetchFromMySQL($current_distrib_key);
return $distribution;
}
function FetchCurrentIndex()
{
$current_index = MemcacheIncrement('foo');
if($current_index === false)
$current_index = MySQLIncrement('foo');
return $current_index;
}
.. etc. Les noms de fonction type de puent, mais je pense que vous aurez l'idée. Lorsque le serveur memcache est de nouveau en mémoire, vous pouvez copier les données de MySQL vers memcache et il est instantanément réactivé.
Je pense que vous n'avez reçu aucune réponse parce que votre problème n'est pas clair. – Galen