Php 缓存Instagram中的多个页面/图像

Php 缓存Instagram中的多个页面/图像,php,caching,instagram,Php,Caching,Instagram,我正在做一个小项目,用户可以看到标记为“kitties”的图像。Instagram每小时只允许5000个请求,我不认为它能达到这个目标,但我选择任何缓存方式。也因为我不知道如何让反向链接工作。 我只能得到下一页的链接,那么最近一页的链接就变成了当前页,一个指向自身的链接。 此外,api可以返回奇怪数量的图像,有时是14,有时是20等等。我希望它总是显示每页20张图片,只有5页(100张图片)。然后每5/10分钟更新一次这个文件 所以,我的计划是将大约100幅图像存储到一个文件中。我让它工作了,但

我正在做一个小项目,用户可以看到标记为“kitties”的图像。Instagram每小时只允许5000个请求,我不认为它能达到这个目标,但我选择任何缓存方式。也因为我不知道如何让反向链接工作。 我只能得到下一页的链接,那么最近一页的链接就变成了当前页,一个指向自身的链接。 此外,api可以返回奇怪数量的图像,有时是14,有时是20等等。我希望它总是显示每页20张图片,只有5页(100张图片)。然后每5/10分钟更新一次这个文件

所以,我的计划是将大约100幅图像存储到一个文件中。我让它工作了,但速度太慢了。 代码如下所示:

$cachefile = "instagram_cache/".TAG.".cache";
$num_requests = 0; //Just for developing and check how many request it does

//If the file does not exsists or is older than *UPDATE_CACHE_TIME* seconds
if (!file_exists($cachefile) || time()-filemtime($cachefile) > UPDATE_CACHE_TIME)
{
    $images = array();
    $current_file = "https://api.instagram.com/v1/tags/".TAG."/media/recent?client_id=".INSTAGRAM_CLIENT_ID;
    $current_image_index = 0;


    for($i = 0; $i >= 0; $i++)
    {
        //Get data from API
        $contents = file_get_contents($current_file);

        $num_requests++;
        //Decode it!
        $json = json_decode($contents, true);

        //Get what we want!
        foreach ($json["data"] as $x => $value)
        {                
            array_push($images, array(
                'img_nr' => $current_image_index,
                'thumb' => $value["images"]["thumbnail"]["url"],
                'fullsize' => $value["images"]["standard_resolution"]["url"],
                'link' => $value["link"], 
                'time' => date("d M", $value["created_time"]),
                'nick' => $value["user"]["username"],
                'avatar' => $value["user"]["profile_picture"],
                'text' => $value['caption']['text'],
                'likes' => $value['likes']['count'],
                'comments' => $value['comments']['data'],
                'num_comments' => $value['comments']['count'],
            ));

            //Check if the requested amount of images is equal or more...
            if($current_image_index > MAXIMUM_IMAGES_TO_GET)
                break;

            $current_image_index++;

        }
        //Check if the requested amount of images is equal or more, even in this loop...
        if($current_image_index > MAXIMUM_IMAGES_TO_GET)
            break;
        if($json['pagination']['next_url'])
            $current_file = $json['pagination']['next_url'];

        else
            break; //No more files to get!

    }
    file_put_contents($cachefile, json_encode($images));
这感觉像是一个非常丑陋的黑客,有什么想法如何使这项工作更好

或者有人可以告诉我如何使“反向链接”正常工作?(是的,我可以在历史上是js和go-1,但不是!)


感谢您的任何想法、建议、帮助、评论等。

为什么不订阅实时图像并将其存储在数据库中?然后,在渲染它们时,可以检查图像url是否有效(检查照片是否已被删除)。从您自己的数据库获取数据要比从instagram获取数据快得多

Gubbfett也有同样的问题,并且实施了类似的解决方案,因为instagram在每小时请求方面似乎有太多该死的限制,不允许多标签搜索,以及每个请求的最大图像数等。您是否已经了解了为什么速度如此之慢,因为我认为直接从磁盘上读取json会非常快,唯一的延迟是将图像渲染到屏幕上?嗯,最慢的是抓取图像,当图像最终被收集时,获取图像没有问题。我曾经做过一些更改,设置了一个mysql数据库来存储图像,然后每隔5分钟以cron的形式运行该文件。它更快、更可靠,而且如果cron正在运行,用户仍然可以获取图像,因为此时它没有写入文件。我测试的5000个imgaes/小时的另一个解决方法是在应用程序中创建多个帐户,并使用一个控制器更改每次搜索的id号是的,我也做过类似的事情,尤其是在需要进行多个标记搜索时,效果非常好,因为我现在可以直接搜索缓存的JSON文件,其中包含结果中每个媒体项的所有标记列表。唯一的诀窍是如何在缓存结果中获得尽可能多的结果(即100+),因为Instagram一次只能抓取30个结果。我打算尝试使用分页选项,尝试在后台使用CRON作业来收回更多内容。我喜欢使用多个帐户来切换ID的想法,这很聪明:)哦,那么你将图像的每个“页面”缓存为单独的文件?我想到了这一点,但当时感觉得到一些复制品是一种风险。我的最终解决方案是做一个如上所述的循环,最多400页。每5分钟就有4800个请求/小时。然后,如果没有下一页,我就删除它。然后,我将每个图像插入到数据库中,并使用“在重复密钥更新时”将图像id作为密钥。问题是最旧的文件(400多页之外)没有更新它们的注释。但我真的不在乎,因为它永远不会达到400;)不,我只缓存请求,所以每个搜索关键字都是一个单独的缓存文件,还有getMedia操作。我唯一没有缓存的显然是诸如LIKE和Authenticate之类的POST操作。好的,基本上你只需要在相同的过程中循环,在5000个限制内获取尽可能多的图像,并每5分钟更新一次缓存文件。因此,对Instagram的每个实时请求都是通过您的CRON作业完成的,所有前端请求都直接到缓存中完成。我喜欢。