在工作中,我们遇到了设置服务器端cookie的问题 - 其中很多都是如此。现在我们有一个PHP脚本,其唯一目的是在我们的域的客户端上设置cookie。这比对服务器(正在运行应用程序)的“正常”请求发生的要多得多,所以我们已经讨论过将它移动到自己的服务器上。这将是一个Apache服务器,可能是专用的,有一个3行长的PHP脚本,只是一遍又一遍地运行。
当然,必须有一种更快,更好的方法,而不是启动整个PHP环境。基本上,我需要一些非常简单的东西,可以整天坐着做以下事情:
md5(microtime)
)有什么建议吗?
答案 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。