缓存大型数组

时间:2014-06-18 19:03:01

标签: php arrays performance caching

我有以下功能:

function f($idx, $arr) {
    static $a;
    if ($a == NULL) {
        foreach ($arr as $v) {
            $key = $v['key'];
            if (!isset($a[$key])) {
                $a[$key] = array();
            }
            $a[$key][] = $v;
        }
    }

    return $a[$idx];
}

最初的条件是:

  1. 函数f()在1个请求中被多次调用
  2. $arr总是很大
  3. $arr在不同的函数调用(低基数)中可能会有所不同
  4. $idx在每个函数调用(高基数)
  5. 中几乎不同

    现在我需要知道,如果$arr已经缓存,如果没有,那么创建这个“缓存版本”,但也保留所有以前的数组。

    根据2.,我无法使用md5(serialize($arr))将其用作标识符,因此我需要另一种方法来确定它。您是否知道如何实现这种高性能缓存功能(假设我无法在此功能之外进行任何更改)?

1 个答案:

答案 0 :(得分:1)

如果不必修改$arr,那么我只需将优化的密钥访问权限直接添加到其中:

// note the argument has been changed to &$arr - we're passing by reference
function f($idx, &$arr) {
    if (empty($arr['___cached'])) {
        $arr['___cached'] = array();
        foreach ($arr as $k => $v) {
            if ($k === '___cached') continue;
            if (!isset($arr['___cached'][$v['key']])) {
                $arr['___cached'][$v['key']] = array();
            }
            $arr['___cached'][$v['key']][] = $v;
        }
    }

    return $arr['___cached'][$idx];
}