有没有办法将大数据对象加载到内存中,通常只需要在每次请求时加载一次?
在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));
}
}
答案 0 :(得分:4)
您可以将其缓存在APC中。像这样的东西,
$hgo = apc_fetch("hgo_v1");
if (!$hgo) {
$hgo = HugeGraphObjectFactory();
apc_store("hgo_v1", $hgo);
}
这样,它只需要为每个服务器实例加载一次对象。
答案 1 :(得分:1)
答案 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中,每次访问服务器都是唯一的。