function foo()
{
// проверяем, что процесса перегенерации кэша ещё нет (предполагается что если нужно перегенерировать кеш - то записи в memchached уже нет)
if (!checkExistProcess('key')&&!isnull($memcache->get('key'))) {
// отмечаем, что процесс перегенерации кэша пошёл
$memcache->set('key', null, 10 ); // время жизни этого ключа должно быть маленьким, но не меньше худшего времени генерации (если будет фейл, чтобы ожидающие процессы не ждали вечно)
$data = getdatafromDb();
// сохраним кеш это так же отметит окончание генерации
$memcache->set('key', $data, 60 * 60);
} else {
// процесс есть, ждём, пока завершится (тут так же можно продумать условие окончания ожидания перегенерации кеша, но времени жизни пометки более чем достаточно)
while(checkExistProcess('key')&&isnull($memcache->get('key') )){
time_nanosleep(0, 100000000);
};
$data = $memcache->get('key');
}
return $data;
} Протокол собственный.
адрес ВПН сервера будет другима это вопрос не ко мне а к вашему провайдеру vpn, либо экспериментально определи список адресов или даже целую подсеть
не понятно зачем и как будешь считать эти расходы, если они у каждого клиента разные.