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

时间:2010-06-14 22:17:01

标签: java php

有没有办法将大数据对象加载到内存中,通常只需要在每次请求时加载一次?

在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 个答案:

答案 0 :(得分:4)

您可以将其缓存在APC中。像这样的东西,

$hgo = apc_fetch("hgo_v1");

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

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

答案 1 :(得分:1)

使用shared memory

答案 2 :(得分:1)

你基本上是在谈论缓存。为此,您需要使用其中一个PHP缓存解决方案--APC,XCache,memcached。有很多很棒的文章在基准测试方面比较了这些解决方案。 Memcached可以跨服务器使用,这就是它如此受欢迎的原因。

我个人使用了memcached和XCache。如果使用得当,存储对象和变量可以减少一半以上的开销。看看Zend_Cache(http://framework.zend.com/manual/en/zend.cache.html),它是一个处理跨平台缓存的类(APC,XCache等)。使用Zend_Cache时,从APC切换到XCache,或者从基于文件切换到memcached就像更改单个字符串一样简单。

答案 3 :(得分:1)

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

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

有一些非常不寻常的情况并非如此(不要认为这绝对是对您的方法的认可)。这里解决问题的方法是开发一个为客户端程序提供服务的守护进程 - 但是如果你使用OO进行编写,那么请注意内存管理(你可以考虑使用循环引用检查垃圾收集器)。 p>

下进行。

答案 4 :(得分:0)

使用PHP我不相信,它的服务器端,因此浏览器每次都会读取和处理...(如果我没有记错的话);)

答案 5 :(得分:0)

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