在Sinatra请求之间共享Ruby变量

维斯林·格纳迪耶夫(Veselin Genadiev)

我试图用sinatra编写一个简单的测验游戏,我需要让所有用户都可以访问公共对象(大厅状态,聊天消息等)。问题在于,Sinatra在每个请求和对象都处于初始状态后会重新加载代码。如何执行呢?

Mdesantis

好吧,这个话题有点棘手。Sinatra实际上不会重置服务器状态:

require 'sinatra'

GlobalState = {}
GlobalState[:some_counter] = 0

get '/' do
  response = "GlobalState[:some_counter]: #{GlobalState[:some_counter]}"
  GlobalState[:some_counter] += 1
  response
end

这段代码没有错:如果您运行它并转到,http://localhost:4567您将看到GlobalState[:some_counter]预期的增量。

但是不鼓励这样做,原因如下,主要与应用程序的网络性质有关:

  1. 由于数据存储在Ruby对象中,因此如果停止服务器,则会丢失数据。但是,如果您不需要持久性数据,那不是问题
  2. 当您运行Web应用程序时,通常会同时具有该应用程序的实例,以便同时处理多个请求。有两种方法可以实现它:
    1. 分支:同一应用程序的多个进程。它们不共享内存,因此Ruby全局状态变量变得毫无用处
    2. 线程:线程共享内存,因此您可以访问全局状态,但是您必须管理对同一全局对象的并发访问,而这不会带来微不足道的后果
  3. 您不能将数据与用户相关联,反之亦然:这是因为HTTP不提供状态保存方法(它是无状态协议)。为了解决它,您需要:
    1. 客户端数据存储:Cookie,HTML5本地存储...
    2. 服务器端数据存储:会话(不是真正的服务器端,你至少需要关联会话各自的客户,通常是存储会话ID添加到饼干)

由于这些原因,Web应用程序数据管理并非易事。无论如何,不​​用担心,您不必重新发明轮子。解决方案在手:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Sinatra请求之间共享Ruby变量

来自分类Dev

Ruby Sinatra存储变量

来自分类Dev

Ruby Sinatra创建发布请求

来自分类Dev

在Lua-Resty(openresty)中的请求之间共享LUA变量

来自分类Dev

在类之间共享变量

来自分类Dev

在ViewController之间共享变量

来自分类Dev

在页面之间共享变量

来自分类Dev

Ruby on Sinatra:基于参数模仿请求

来自分类Dev

在Sinatra中,在路线和耙任务之间共享代码?

来自分类Dev

在Shell脚本之间共享变量

来自分类Dev

在多个类别之间共享变量

来自分类Dev

在协程之间共享变量

来自分类Dev

angularjs在函数之间共享变量

来自分类Dev

在方法重载之间共享变量?

来自分类Dev

在课程之间共享变量

来自分类Dev

在QT类之间共享变量

来自分类Dev

angularjs在函数之间共享变量

来自分类Dev

在swift文件之间共享变量

来自分类Dev

Ansible:在组之间共享变量

来自分类Dev

Ruby:如何在两个单独的类之间共享实例变量?

来自分类Dev

Ruby:如何在运行 object.method 的线程之间共享全局变量

来自分类Dev

在Rails和Sinatra之间通过memcached共享数据时,如何修复Sinatra不处理ActiveSupport

来自分类Dev

如何使实例在Sinatra中的请求之间持久存在?

来自分类Dev

ruby / sinatra处理ajax请求,但是什么也没发生

来自分类Dev

Python Tornado更新请求之间的共享数据

来自分类Dev

PhantomJS是否在多个请求之间共享内存?

来自分类Dev

在SocketServer请求之间重用变量

来自分类Dev

PHP请求之间的递增变量

来自分类Dev

在SocketServer请求之间重用变量