所以我有以下代码:
private function getArtistInfo($artist){
$artisan = json_decode($artist, true);
$artistObj = array();
//fb($artist);
$artistObj['id'] = $artisan['name']['ids']['nameId'];
$memcache = new Memcached($artistObj['id']);
$artistCache = $memcache->getMemcache();
if($artistCache === false){
$artistObj['name'] = $artisan['name']['name'];
$artistObj['image'] = $artisan['name']['images'][0]['url'];
$initArtist = array('id' => $artistObj['id'], 'name' => $artistObj['name'], 'image' => $artistObj['image']);
$artistObj = $this->buildArtist($artisan, $artistObj);
$memcache->setMemcache($artistObj);
}
else{
$initArtist = array('id' => $artistCache['id'], 'name' => $artistCache['name'], 'image' => $artistCache['image']);
}
return $initArtist;
}
现在代码可以工作,但是当我只想要$ initArtist值时,getArtistInfo()需要太长时间才能完成;我希望我的客户端在构建后立即获得$ initArtist,并以某种方式让$ artistObj的缓存在后台运行。
到目前为止,我已经阅读了一些我认为可能有用的不同主题:事件委托,回调函数,call_user_func,观察者模式,线程,齿轮等等。但是,我不知道它们中的哪一个实际上会做什么我想。请指出正确的方向。
编辑:
我的Memcached课程:
class Memcached {
private static $MEMCACHED_HOST = "localhost";
private static $MEMCACHED_PORT = "11211";
private $id, $key, $memcache, $cacheOK;
function __construct ($id){
$this->id = $id;
$this->key = 'artistID_'. $this->id;
$this->memcache = new Memcache;
$this->cacheOK = $this->memcache->connect(Memcached::$MEMCACHED_HOST, Memcached::$MEMCACHED_PORT);
}
protected function getMemcache(){
$artistInfo = null;
if($this->cacheOK === true){
$artistInfo = $this->memcache->get($this->key);
}
if($artistInfo === false){
return false;
}
return $artistInfo;
}
public function setMemcache($artistInfo){
$this->memcache->set($this->key, $artistInfo, 0, 60);
}
}
我的buildArtist()代码:
private function buildArtist($artisan, $artistObj){
$artistObj['amgID'] = $artisan['name']['ids']['amgPopId'];
$discography = $artisan['name']['discography'];
foreach($discography as $album){
$albumID = $album['ids']['amgPopId'];
preg_match('/(\d+)/', $albumID, $matches);
$albumObj['amgAlbumID'] = $matches[1];
$albumObj['title'] = $album['title'];
$albumObj['releaseDate'] = $album['year'];
$albumObj['more'] = $this->getMoreMusic($albumObj['title'], $artistObj['name']);
$artistObj['discography'][] = $albumObj;
}
return $artistObj;
}
答案 0 :(得分:0)
嗯,太长的时间并不完全清楚,或者这段代码的哪一部分会减慢你的速度。据我们所知,慢速部分不是将数据存储在Memcached中的部分。
在任何情况下,一旦确定这是您的瓶颈,您可以做的一件事就是使用像ZeroMQ这样的无代理消息传递队列来完成此类乱序执行接受需要缓存的JSON对象。然后,单独的PHP脚本可以在任何Web请求之外异步处理和缓存这些请求。这个单独的脚本可以通过cron-job或其他一些并行处理缓存部分的作业管理器来运行。
答案 1 :(得分:0)
您想使用set
和get
而不是使用内存缓存持久性ID,我甚至不确定setMemcache
和getMemcache
是什么,但它们不是在扩展文档中。
以下是文档中的示例:
<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
if (!($ip = $m->get('ip_block'))) {
if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
$ip = array();
$m->set('ip_block', $ip);
} else {
/* log error */
/* ... */
}
}
请出示buildArtist
的代码以获取有关优化的帮助。