5

我正在尝试在 PHP 中实现一个 hashmap(PHP 中的关联数组),它在应用程序范围内可用,即将它存储在应用程序上下文中,当程序结束时它不应该丢失。我怎样才能在 PHP 中实现这一点?

谢谢,

4

2 回答 2

1

您可以为此使用APC类似软件,您放在那里的数据将在共享内存中可用。

请记住,这当然不会在服务器重新启动之间持续存在。

于 2012-05-30T18:01:21.590 回答
1

如果您使用的是 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.
于 2012-05-30T18:03:25.550 回答