我正在尝试在 PHP 中实现一个 hashmap(PHP 中的关联数组),它在应用程序范围内可用,即将它存储在应用程序上下文中,当程序结束时它不应该丢失。我怎样才能在 PHP 中实现这一点?
谢谢,
我正在尝试在 PHP 中实现一个 hashmap(PHP 中的关联数组),它在应用程序范围内可用,即将它存储在应用程序上下文中,当程序结束时它不应该丢失。我怎样才能在 PHP 中实现这一点?
谢谢,
您可以为此使用APC或类似软件,您放在那里的数据将在共享内存中可用。
请记住,这当然不会在服务器重新启动之间持续存在。
如果您使用的是 Zend 的 php 版本,这很容易。
您不需要序列化您的数据。
只能缓存内容。文件句柄等资源不能。要存储真/假,请使用 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();
对于没有zend的,上面对应的APC版本:
店铺:
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.
}
从未使用过提到的任何其他方法。如果您没有可用的共享内存,您可以将数据序列化/反序列化到磁盘。当然,共享内存要快得多,而且 zend 的好处是它可以为您处理并发问题并允许命名空间:
店铺:
file_put_contents('/tmp/some_filename',serialize($any_variable));
取回:
$any_variable = unserialize(file_get_contents('/tmp/some_filename') );
编辑:要自己处理并发问题,我认为最简单的方法是使用锁定。我仍然可以在 lock exists 和 get lock 之间的这个伪代码中看到竞争条件的可能性,但你明白了。
伪代码:
while ( lock exists ) {
microsleep;
}
get lock.
check we got lock.
write value.
release lock.