cld*_*020 5 php hashmap applicationcontext
我试图在PHP中实现一个可用于应用程序范围的散列图(PHP中的关联数组),即将其存储在应用程序上下文中,它不应该在程序结束时丢失.我怎样才能在PHP中实现这一目标?
谢谢,
如果您使用 Zend 版本的 php,那么这很容易。
您不需要序列化您的数据。
只能缓存内容。文件句柄等资源则不能。要存储真/假,请使用 1,0,以便您可以区分缓存失败和 的结果===。
店铺:
zend_shm_cache_store('cache_namespace::this_cache_name',$any_variable,$expire_in_seconds);
Run Code Online (Sandbox Code Playgroud)
取回:
$any_variable = zend_shm_cache_fetch('cache_namespace::this_cache_name');
if ( $any_variable === false ) {
# cache was expired or did not exist.
}
Run Code Online (Sandbox Code Playgroud)
对于长期存在的数据,您可以使用:
zend_disk_cache_store();zend_disk_cache_fetch();
Run Code Online (Sandbox Code Playgroud)
对于没有 zend 的用户,上面对应的 APC 版本:
店铺:
apc_store('cache_name',$any_variable,$expire_in_seconds);
Run Code Online (Sandbox Code Playgroud)
取回:
$any_variable = apc_fetch('cache_name');
if ( $any_variable === false ) {
# cache was expired or did not exist.
}
Run Code Online (Sandbox Code Playgroud)
从未使用过提到的任何其他方法。如果您没有可用的共享内存,您可以将数据序列化/反序列化到磁盘。当然,共享内存要快得多,zend 的好处是它可以为您处理并发问题并允许命名空间:
店铺:
file_put_contents('/tmp/some_filename',serialize($any_variable));
Run Code Online (Sandbox Code Playgroud)
取回:
$any_variable = unserialize(file_get_contents('/tmp/some_filename') );
Run Code Online (Sandbox Code Playgroud)
编辑:要自己处理并发问题,我认为最简单的方法是使用锁定。我仍然可以在这个伪代码中看到锁存在和获取锁之间存在竞争条件的可能性,但你明白了。
伪代码:
while ( lock exists ) {
microsleep;
}
get lock.
check we got lock.
write value.
release lock.
Run Code Online (Sandbox Code Playgroud)