Memo::$prefix = $prefix; }); def_memo('bu\\def\\memcached', function () { $r = new Memcached(); $r->addServer('localhost', 11211); return $r; }); def('def_md', function ($nm, $timeout, $fn, $key_fn = null) { def($nm, function () use($nm, $timeout, $fn, $key_fn) { $args = func_get_args(); if (!is_null($key_fn)) { $key = $key_fn($nm, $args); } else { $key = '-bu-defun-' . md5($nm . '-' . serialize($args)); } $m = bu\def\memcached(); $data = $m->get($key); if ($m->getResultCode() == Memcached::RES_SUCCESS) { return $data; } $data = call_user_func_array($fn, $args); $m->set($key, $data, $timeout); return $data; }); }); def('def_accessor', function ($name, $defaul = null) { def($name, function () use($defaul) { static $state, $first_run = true; if ($first_run) { $state = $defaul; $first_run = false;
<?php // Четвёртым аргументом для def_md можно передат функцию, которая будет // создавать ключ для кэширования результатов def_md('sum', 5, function ($a, $b) { echo "."; return $a + $b; }, function ($fname, $args) { return "{$fname}:" . implode('-', $args); }); echo sum(1, 2) . "\n"; echo sum(1, 2) . "\n"; echo bu\def\memcached()->get('sum:1-2') . "\n"; flush_md(); echo bu\def\memcached()->get('sum:1-2') . "\n"; echo sum(1, 2) . "\n"; echo sum(1, 2) . "\n"; ?> --- .3 3 3 .3 3