【问题标题】:Server with the sole purpose of setting cookies仅用于设置 cookie 的服务器
【发布时间】:2011-08-14 09:17:32
【问题描述】:

在工作中,我们遇到了设置服务器端 cookie 的问题——其中很多。现在我们有一个 PHP 脚本,其唯一目的是在客户端上为我们的域设置一个 cookie。这比对服务器(正在运行一个应用程序)的“正常”请求要多得多,所以我们已经讨论过将它移到它自己的服务器上。这将是一个 Apache 服务器,可能是专用的,有一个 3 行长的 PHP 脚本,一遍又一遍地运行。

当然必须有一种更快、更好的方法来执行此操作,而不是启动整个 PHP 环境。基本上,我需要一些超级简单的东西,可以整天/晚上坐在那里做以下事情:

  1. 检查是否设置了某个cookie,并且
  2. 如果未设置该 cookie,则用随机哈希填充它(现在是简单的 md5(microtime)

有什么建议吗?

【问题讨论】:

  • 你能提供更多细节吗?为什么你会设置 cookie 而不是“正常”请求?或许可以告诉我们您更新 Cookie 的时间和原因,我们可能会提出建议。
  • 我可以告诉你,但我必须杀了你:)。我只是想知道是否有比 PHP 更快、或许更专用的方式来设置 cookie。 cookie 永远不会更新 - 只需设置一次,然后被其他事物(应用程序、其他页面上的跟踪像素等)读取。
  • 您可以尝试使用 Apache 或其他工具直接设置它们,但这里似乎有些不对劲。 Cookie 不需要专用服务器。也许您可以在客户端而不是服务器上典当一些处理?在不了解 cookie 的使用方式和频率的情况下,很难给出很多见解。也许考虑使用会话变量来避免一遍又一遍地读取cookie?如果没有更多信息,不确定您真正需要什么。
  • 为了为该域设置 cookie,它需要位于响应的 http 标头中。 (en.wikipedia.org/wiki/HTTP_cookie#Setting_a_cookie)。所以用 Apache 设置它也许是一种选择。

标签: apache cookies


【解决方案1】:

可以自己创建一个简单的 http 服务器来接受请求并返回 set-cookie 标头和空正文。这将允许您将 cookie 生成开销移动到您认为合适的任何位置。

不过,我赞同上面的观点;除非 cookie 生成非常昂贵,否则我认为您不会从当前设置中获得太多收益。

举个例子,这是一个用Tornado 编写的非常简单的服务器,它只是将GET 或HEAD 请求上的cookie 设置为'/'。它包括一个监听“/async”的异步示例,根据您获取 cookie 值的操作,该示例可能有用。

import time
import tornado.ioloop
import tornado.web


class CookieHandler(tornado.web.RequestHandler):
    def get(self):
        cookie_value = str( time.time() )
        self.set_cookie('a_nice_cookie', cookie_value, expires_days=10)
        # self.set_secure_cookie('a_double_choc_cookie', cookie_value)
        self.finish()

    def head(self):
        return self.get()


class AsyncCookieHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        self._calculate_cookie_value(self._on_create_cookie)

    @tornado.web.asynchronous
    def head(self):
        self._calculate_cookie_value(self._on_create_cookie)

    def _on_create_cookie(self, cookie_value):
        self.set_cookie('double_choc_cookie', cookie_value, expires_days=10)
        self.finish()

    def _calculate_cookie_value(self, callback):
        ## meaningless async example... just wastes 2 seconds
        def _fake_expensive_op():
            val = str(time.time())
            callback(val)
        tornado.ioloop.IOLoop.instance().add_timeout(time.time()+2, _fake_expensive_op)



application = tornado.web.Application([
    (r"/", CookieHandler),
    (r"/async", AsyncCookieHandler),
])


if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

使用 Supervisord 启动此过程,您将拥有一个简单、快速、低开销的服务器来设置 cookie。

【讨论】:

    【解决方案2】:

    可以尝试使用mod_headers(通常在默认安装中可用)手动构造Set-Cookie 标头并发出它——无需编程只要它相同cookie 每次。像这样的东西可以在 .htaccess 文件中工作:

    Header add Set-Cookie "foo=bar; Path=/; Domain=.foo.com; Expires=Sun, 06 May 2012 00:00:00 GMT"
    

    但是,这对您不起作用。这里没有代码。这只是一个愚蠢的标题。它无法提供您想要的新随机值,也无法按照标准做法调整过期日期。

    这将是一个 Apache 服务器,可能是专用的,有一个 3 行长的 PHP 脚本,只是一遍又一遍地运行。 [...] 肯定有一种更快、更好的方法来做到这一点,而不是启动整个 PHP 环境。

    您使用的是APC 还是其他字节码缓存?如果是这样,几乎没有启动成本。因为您正在谈论为此设置整个服务器,所以听起来您也可以控制服务器。这意味着您可以关闭 apc.stat 以减少对启动的影响。

    确实,如果该脚本所做的只是构建一个 md5 哈希和设置一个 cookie,它应该已经非常快,尤其是如果它是 mod_php。您是否已经知道,尽管进行了基准测试和测试,该脚本的性能不如您希望的那样好?如果是这样,您能与我们分享这些基准吗?

    【讨论】:

    • 我没有……还没有问题。但我们对自己提供内容持谨慎态度,因为我们对大多数内容使用 CDN。
    • 您的技术堆栈的其余部分是什么?您能告诉我们更多关于您的一般性能问题吗?
    • 我们有一个 CentOS 服务器和一个 RedHat 服务器。不过,我们不一定在这方面受到限制。
    • 我的意思是,您的网站采用什么语言和平台? php?珀尔? Python?红宝石? Java或JVM上的东西?服务器端 JS?冷融合?单核细胞增多症?科尔博? INTERCAL?
    • 大部分应用程序是 PHP,使用 CakePHP 框架。但是 Python 中有各种机制(日志解析等)。
    【解决方案3】:

    知道为什么你认为你需要额外的服务器会很有趣——你真的有生成 cookie 或其他地方的瓶颈吗?是因为请求发生很多而写的日志吗? ajax 轮询?客户端下载速度?

    至少对于初学者来说,我看起来比获取时间来生成“随机哈希”更有效。例如,在我拥有的这台 intel i7 笔记本电脑上,从 microtime 生成 999999 个 md5 散列大约需要 4 秒,而使用随机数做同样的事情要快 2 秒(不考虑 rand 的种子)。

    然后,如果您考虑打开/关闭套接字,只是移动您的脚本(这很可能已经非常快 - 也就是说,不知道您的页面如何考虑到这一点),您最终会变慢下来的请求。实际上,既然我已经重新阅读了您的问题,这让我觉得您的 cookie setter 脚本已经是一个专用页面?还是您只是“包含”到另一个 php 脚本提供的真实内容中?如果没有,请尝试这种方法。如果您有 apache 的默认日志记录规则,这也将是有益的,如果在自己的页面上设置了 cookie,您的 apache 将为此记录一行,并且在高负载系统中,这将累积到 apache 花费的总 io 时间。

    另外,考虑测试是否设置了 cookie,然后设置它,可能比仅仅强制设置它总是慢,即使 cookie 存在与否?

    但总的来说,我认为您不需要设置服务器来卸载 cookie 生成,而无需了解更多关于您现在如何处理 cookie 的信息。除非您正在做一些非常讨厌的事情。

    【讨论】:

    • 没什么邪恶的,我保证!这是一个专门的页面,用于回答您的问题。
    • 好的,那么如果它的专用页面那么我会
    • 好的,那么如果它的专用页面那么我会说当客户端查询您的 cookie 页面并将其与更快的 cookie/哈希生成相结合时,您将获得一点往返时间。见:stackoverflow.com/questions/3665247/…
    【解决方案4】:

    Apache 有一个名为mod_usertrack 的模块,看起来它可能完全符合您的要求。不需要 PHP,您可能会创建一个真正优化的轻量级 Apache 配置来提供服务。

    如果你想更快地完成一些事情并且乐于不使用 Apache,你可以使用 lighttpd,它是 mod_usertrack 或 nginx 的 HttpUserId 模块

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2020-09-22
      • 2023-02-25
      • 1970-01-01
      • 2020-02-07
      • 2019-05-23
      • 1970-01-01
      相关资源
      最近更新 更多