Если вы используете версию php Zend, это легко.
Вам не нужно сериализовать данные.
Только содержимое может быть кэшировано. Ресурсы, такие как дескрипторы файлов, не могут. Чтобы сохранить true/false, используйте 1,0, чтобы вы могли отличить кэш от результата с ===
.
Магазин:
zend_shm_cache_store('cache_namespace::this_cache_name',$any_variable,$expire_in_seconds);
Получить:
$any_variable = zend_shm_cache_fetch('cache_namespace::this_cache_name');
if ($any_variable === false) {
# cache was expired or did not exist.
}
Для долгоживущих данных вы можете использовать:
zend_disk_cache_store();zend_disk_cache_fetch();
Для тех, кто не Зенд, соответствующие версии АРС вышеперечисленного:
Магазин:
apc_store('cache_name',$any_variable,$expire_in_seconds);
Получить:
$any_variable = apc_fetch('cache_name');
if ($any_variable === false) {
# cache was expired or did not exist.
}
Никогда не использовал ни одного из других упомянутых методов. Если у вас нет доступной для вас общей памяти, вы можете сериализовать/unserialize данные на диск. Конечно, разделяемая память намного быстрее, и хорошая вещь о Зенд это он обрабатывает проблемы параллелизма для вас и позволяет пространство имен:
Магазин:
file_put_contents('/tmp/some_filename',serialize($any_variable));
Получить:
$any_variable = unserialize(file_get_contents('/tmp/some_filename'));
Edit: Для того, чтобы справиться с проблемы параллелизма, я думаю, что самый простой способ - использовать блокировку. Я все еще вижу возможность условия гонки в этом коде psuedo между блокировкой и блокировкой, но вы понимаете смысл.
код псевдопользователей:
while (lock exists) {
microsleep;
}
get lock.
check we got lock.
write value.
release lock.
PHP сам по себе не имеет никакого 'контекста приложения'. Есть обходные пути (а именно хранение вещей в файлах или разделяемой памяти), но в остальном ничего не сохранится в конце выполнения скрипта PHP. – zneak