服务器的唯一目的是设置cookie

时间:2011-04-28 04:10:59

标签: apache cookies

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

当然,必须有一种更快,更好的方法,而不是启动整个PHP环境。基本上,我需要一些非常简单的东西,可以整天坐着做以下事情:

  1. 检查是否设置了某个Cookie,
  2. 如果没有设置该cookie,请使用随机哈希填充它(现在它是一个简单的md5(microtime)
  3. 有什么建议吗?

4 个答案:

答案 0 :(得分:0)

可以尝试使用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。您是否已经知道,虽然基准测试和测试,脚本的性能不如您所希望的那么好?如果是这样,你能与我们分享这些基准吗?

答案 1 :(得分:0)

知道为什么你认为你需要额外的服务器会很有趣 - 你真的有瓶颈用于生成cookie或其他地方吗?是请求发生的日志写作吗? ajax民意调查?客户端下载速度?

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

然后,如果您考虑打开/关闭套接字,只需移动您的脚本(很可能已经非常快 - 也就是说,不知道您的网页如何考虑到这一点),您最终会实际上放慢速度请求。实际上,既然我已经重新阅读了你的问题,那么我认为你的cookie setter脚本已经是一个专用的页面?或者你只是“包含”到另一个PHP脚本服务的真实内容?如果没有,尝试这种方法。如果您有apache的默认日志记录规则,这将是有益的,如果在自己的页面上设置了cookie,您的apache将为此记录一行,在高负载系统中,这将累积到apache的总时间消耗。

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

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

答案 2 :(得分:0)

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

如果你想更快地找到更好的东西而且很乐意不使用Apache,你可以使用lighttpd,它是mod_usertrack或nginx的HttpUserId模块

答案 3 :(得分:0)

可以自己创建一个简单的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。