建议提高API调用和缓存的效率

时间:2014-02-18 05:32:35

标签: php

所以我有以下代码:

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;
    }

2 个答案:

答案 0 :(得分:0)

嗯,太长的时间并不完全清楚,或者这段代码的哪一部分会减慢你的速度。据我们所知,慢速部分不是将数据存储在Memcached中的部分。

在任何情况下,一旦确定这是您的瓶颈,您可以做的一件事就是使用像ZeroMQ这样的无代理消息传递队列来完成此类乱序执行接受需要缓存的JSON对象。然后,单独的PHP脚本可以在任何Web请求之外异步处理和缓存这些请求。这个单独的脚本可以通过cron-job或其他一些并行处理缓存部分的作业管理器来运行。

答案 1 :(得分:0)

您想使用setget而不是使用内存缓存持久性ID,我甚至不确定setMemcachegetMemcache是什么,但它们不是在扩展文档中。

以下是文档中的示例:

<?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的代码以获取有关优化的帮助。