2012-07-27 27 views
0

这对我来说很有趣,我也检查过它。您可以阅读NewRequest订阅者在每次请求时被调用3次(或启用debug_toolbar时为7次),而BeforeRender订阅者在每次请求时被调用1次(启用debug_toolbar时>> 30次)。金字塔:为什么NewRequest订户在每次请求中都会调用3次?

所以,如果我想通过NewRequest事件会做3次,每次请求MongoDB的连接到我的项目...

这是为什么?为什么服务器每次请求都要做同样的工作3次?

在此先感谢!

+1

您不应该在用户中创建到MongoDB的连接。我为金字塔写了一个插件。连接在启动时完成。数据库句柄在app_factory或root_factory中完成。换句话说,它只是一个从启动时创建的连接获取数据库句柄的调用。你可以多次调用它,它不会创建新的连接,只要你有请求就可以随时调用它。在我看来,创建一个用户来设置分贝并不是一件好事。 – 2012-07-28 22:06:34

回答

5

金字塔不会每个请求多次呼叫NewRequest。这种情况发生的唯一原因是您无意中多次注册您的订户。人们认为它被多次调用的另一个常见原因是,浏览器通常会使用一个favicon请求来处理请求,但这只会占用2次调用。您是否可以显示任何输出或更详细地描述您的问题来说服我确定用户真的被多次调用?

BeforeRender将被多次调用(每个模板呈现一次)。当启用调试工具栏时,每个请求上都会显示很多东西,但即使如此,30次听起来也更像我期望的3倍。一般情况下,连接到你的数据库不是一个好主意,因为这个订阅者也会被调用静态资源(字面上是所有的请求)。更好的模式是通过config.set_request_propertyrequest对象上创建一个惰性/被指定属性。这将在您首次在每个请求中使用数据库时连接,并且在您不使用时不会影响性能。

+0

另请注意,任何其他静态资源都会触发NewRequest(至少在开发时)。那就是:js,css,图片等。在初始请求之后,页面加载其他几个文件是正常的。在制作时,建议直接将这些文件提供给Web服务器,而不是将它们与应用程序一起提供。 – 2012-07-27 23:32:31

相关问题