最近在研究一个搜索项目。所有数据来自网络API搜索,现在遇到一个问题,想请教大家。由于API调用次数限制,以及分页的要求。 我把:每个客户通过各自搜索,所获得的数据  $item['title'] , $item['content'], $item['link'],缓存进临时文件里。这样在用户翻页时,不再涉及API的调用,而调用临时文件。
我的思路是:
方案一:把数据缓存进临时数据库,再调用,但是比较麻烦,而且占用数据库连接。
方案二:下面代码的方法:把数据缓存外部XML文件,但是如何判断用户浏览完毕,离开页面后,自动删除该临时文件呢?
方案三:是否可以写进外部PHP文件里?(不用file_put_contents进行缓存),这样每个用户在各自客户端浏览器打开页面时,各自不受影响,关闭浏览器后会自动清除缓存。这个方案是否可行?占用资源少?求这个方案的简单代码。
或者大家又更好的方法帮我解决这个问题。欢迎建议。谢谢。$phpxml .= '<?xml version="1.0" encoding="utf-8"?>';
$phpxml .= '<items>';
foreach ($arr as $item){
$phpxml .= '<item>';
        $phpxml .= '<title>'.html_entity_decode($item['title'], ENT_QUOTES, 'UTF-8').'</title>';
$phpxml .= '<content>'.html_entity_decode($item['content'], ENT_QUOTES, 'UTF-8').'</content>';
$phpxml .= '<link>'.html_entity_decode($item['link'], ENT_QUOTES, 'UTF-8').'</link>';
$phpxml .= '</item>';
}
$phpxml .= '</items>';
$xmlname = mktime(date("Y-m-d H:i:s"));
file_put_contents( dirname(__FILE__) . '/'.$xmlname.'.xml', $phpxml);

解决方案 »

  1.   

    建议楼主看看 ob_start();php的缓存机制;使用 ob_get_content(); 然后在关闭 缓存;其实就是将数据放入内存中 ;有什么 可以 qq探讨;呵呵822294415
      

  2.   

    @yaoxin125,可否不放进内存?数据比较大,放进内存的话太耗资源了。还有别的方法吗?
      

  3.   

    可以参考session file gc机制,存文件,用户每次搜索按一定几率删掉过期无用文件。
      

  4.   

    个人觉得方案3不错。
    可以将数据存成数组的形式。
    <?php
    array{
     0 => 
      array (
        'title' => '',
        'content' => '',
        'link' => '',
      ),
      1 => 
      array (
        'title' => '',
        'content' => '',
        'link' => '',
      ),
      ...
    }
    ?>
    这样在调用的时候直接include这个缓存文件就可以了。由于要区分不同用户,这里可以将缓存文件根据用户的会话ID或者其他能唯一标记用户的值来命名。
    但如果网站流量很大,这种方法显然不合适,IO是很大的瓶颈,而且还会产生大量的文件碎片。
      

  5.   

    感谢楼上几位。
    个人感觉最好不要占内存。因为数据量比较大,不管网站在线用户多是,都会造成一定的瓶颈。
    最好可以缓存到硬盘文件里,然后可以根据页面每个用户SESSION过期,删除这些文件。
    但是具体用哪些方法,哪些函数,还是要继续请教大家。
      

  6.   

    你的几种方法都占用服务器资源,我都不赞成
    近期我在做一个旅馆搜寻的网站,网站很大,其中设施服务的部分好几千条数据
    对于这么大的数据我不可能每次都从服务器的数据库读取,那就效率太低了
    所以我把他们独取出来缓存进了json,这样只需要在客户端用js操作json就行了.而你的状况和我的有所不同,所以我说一下针对你这种状况的解决思路:
    我的思路就是把数据交给客户端,让客户端来处理数据,从而解放服务器
    因为你是每个访问者的数据都不同,所以你可以把用户的搜索结果在服务器端取得之后然后产生json数据,之后马上将此json数据缓存到客户端的cookie里就行了
    这样该用户之后的操作都让他在客户端用js读取cookie的值,并对该值进行操作,从而让服务器解放出来.
    这种方法服务器需要做的工作就是客户在第一次搜索之后提取数据并将数据以json的格式写入cookie,之后服务器就不需要再拼命工作了.因为之后的工作都由客户端的js来做,所以此时占用的内存资源是来自客户端用户的电脑,而非服务器的.
      

  7.   

    楼上的方法很好啊,不过对于将数据缓存到客户端的cookie,非常陌生。(陌生这种存储读取的方法)
    有简单的实例吗?如何存储?如何调用?
    谢谢了。
      

  8.   

    据说每个cookie变量最大能放2K,每个cookie里好象只有20个变量.
    当然你可以设定多个cookie,但是每次请求,浏览器都会把所有的COOKIE带上:转载:http://wuliupo.blog.163.com/blog/static/4523259201083032242989/
    今天要把一个游戏列表存放到 cookies中,列表太长,我就设法存放成多个 cookies
    想不到每次客户端请求 http资源,会把cookies带上,就出现下面的错误了,真是郁闷【COOKIE的大小限制详解】SIZE OF A REQUEST HEADER FIELD EXCEEDS SERVER LIMIT .
    如果碰到Apache报错如下
    Bad Request
    Your browser sent a request that this server could not understand.
    Size of a request header field exceeds server limit .
    Cookie: .....................这一般是由于Cookie太多了,Cookie的长度和Http Server的设置有关,Apache,用这个参数调整
    LimitRequestFieldSize 限制客户端发送的请求头的字节数 【默认 8190】
    LimitRequestLine  限制接受客户端发送的HTTP请求行的字节数【默认 8190】太大会降低apache的性能.这里调整好后,你客户端的cookie就随便了,只要每个key和value的字节总和不超过5117就可以了。
    原来限制cookie大小的不止是客户端,而且有服务器每一個 Cookie 的大小不得超過 4KB。
    每一個 URL 路徑,最多只能設定 20 個 Cookie
      

  9.   

    2K? 不行,我生成的一个XML临时文件,大约50K左右,去掉无用的XML树状标签,换成JSON的话,至少也有2,30个KB……
    难道没有办法缓存在PHP页面里吗?
    比如放进一个model.php里,再用INCLUDE或JQUERY LOAD,JQUERY AJAX调用。
    用户关闭页面后,这个PHP文件里的数据也就清除掉了。
      

  10.   

    COOKIES有大小限制,放数据库又麻烦耗时。写XML又占内存!除了以上几种,好象没有什么更好的方法了。
      

  11.   

    第一次的数据库查询总是需要的
    你可以将查询结果放在 session 里
    完全没有必要自行编程或第三方工具来完成缓存
      

  12.   

    xuzuning大哥,用session怎么完成缓存?
    由于页面涉及到翻页,所有只有将数据储存在其他页面,然后引入。这个过程小弟不会。能否解释的详细点?
    谢谢。
      

  13.   

    xuzuning大哥,用session怎么完成缓存?
    有什么实例供参考吗?