代码之家  ›  专栏  ›  技术社区  ›  eikes

我可以只加载一次大量数据并在每个请求中使用它吗?

  •  2
  • eikes  · 技术社区  · 15 年前

    在Java中,当加载servlet时,可以实例化servlet中的对象,但一旦它存在,就可以在任何请求中使用它。示例如下。这可以用PHP实现吗?

    public class SampleServlet extends HttpServlet {  
      private static HugeGraphObject hgo;
    
      public void init() {
        hgo = HugeGraphObjectFactory.get();
      }
    
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String param = request.getParameter("q");
        response.getWriter().write(hgo.getSomeThing(param));
      }
    }
    
    6 回复  |  直到 15 年前
        1
  •  1
  •   webjawns.com    15 年前

    实际上,您是在谈论缓存。为了做到这一点,您需要使用一种PHP缓存解决方案-APC、XCache、memcached。有很多优秀的文章从基准测试的角度比较了这些解决方案。Memcached可以跨服务器使用,这就是它如此流行的原因。

    我个人使用过memcached和XCache。如果使用得当,存储对象和变量可以将开销减少一半以上。看看Zendèu缓存( http://framework.zend.com/manual/en/zend.cache.html ),这是一个处理跨平台(APC、XCache等)缓存的类。在使用Zend\u缓存时,从APC切换到XCache,或者从基于文件切换到memcached,只需更改一个字符串即可。

        2
  •  4
  •   ZZ Coder    15 年前

    你可以把它缓存在APC里。像这样的事,

    $hgo = apc_fetch("hgo_v1");
    
    if (!$hgo) {
       $hgo = HugeGraphObjectFactory();
       apc_store("hgo_v1", $hgo);
    }
    

    这样,每个服务器实例只需加载一次对象。

        3
  •  1
  •   Ignacio Vazquez-Abrams    15 年前
        4
  •  1
  •   symcbean    15 年前

    正如其他人所说,为PHP分配的内存会被吹走,并为每个请求重新初始化—因此,您希望在单个请求之外持久化的任何数据都需要存储在这里。这也意味着将其加载回PHP变量以服务请求会有很大的开销。

    如果您试图使用PHP编写Java程序,那么您不会走得太远。这并不是PHP的失败——如果你试图用Java编写C程序,或者用Forth编写Lisp程序,那么你也会遇到同样的问题。我认为,通过重构/将数据推送到相关的存储介质并有效地查询,很有可能解决这个问题。

    C.

        5
  •  0
  •   Zuul KrapocK    15 年前

        6
  •  0
  •   Aaron Butacov    15 年前

    在PHP中,每次对服务器的访问都是唯一的。