Сервер с единственной целью настройки куки - PullRequest
1 голос
/ 28 апреля 2011

На работе мы столкнулись с проблемой установки файлов cookie на стороне сервера - их много. Прямо сейчас у нас есть PHP-скрипт, единственная цель которого - установить cookie на клиенте для нашего домена. Это происходит гораздо чаще, чем «обычные» запросы к серверу (на котором запущено приложение), поэтому мы обсудили перемещение его на свой собственный сервер. Это может быть сервер Apache, вероятно, выделенный, с одним PHP-скриптом длиной 3 строки, просто работающий снова и снова.

Конечно, должен быть более быстрый и лучший способ сделать это, а не запускать всю среду PHP. По сути, мне нужно что-то супер простое, которое может сидеть без дела весь день / ночь, выполняя следующее:

  1. Проверьте, установлен ли определенный файл cookie, и
  2. Если этот cookie не установлен, заполните его случайным хешем (сейчас это просто md5(microtime))

Есть предложения?

Ответы [ 4 ]

0 голосов
/ 12 мая 2011

Вы можете самостоятельно создать простой http-сервер для приема запросов и возврата заголовка set-cookie и пустого тела. Это позволит вам переместить накладные расходы на создание файлов cookie в любое удобное для вас место.

Я повторяю чувства выше, хотя; Если генерация файлов cookie не требует значительных затрат, я не думаю, что вы сильно выиграете, если перейдете от своих текущих настроек.

В качестве примера приведем чрезвычайно простой сервер, написанный на Tornado , который просто устанавливает cookie для запросов GET или HEAD в '/'. Он включает пример асинхронного прослушивания '/ 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.

0 голосов
/ 09 мая 2011

Было бы интересно узнать, почему вы думаете, что вам нужен дополнительный сервер - у вас на самом деле есть узкое место для создания cookie или где-то еще? Это запись журнала, когда запросы происходят много? опрос ajax? Скорость загрузки клиента?

По крайней мере, для начинающих, я бы посмотрел что-то более эффективное, чем выбор времени для генерации "случайного хэша". Например, на этом ноутбуке Intel i7 генерация 999999 хешей md5 из microtime занимает примерно около 4 секунд, а выполнение той же операции со случайными числами происходит на секунду быстрее (без учета ранда).

Затем, если вы примете во внимание открытие / закрытие сокета, просто перемещая ваш скрипт (что, скорее всего, уже очень быстро - то есть, не зная, как ваши страницы это учитывают), вы в конечном итоге замедлитесь. вниз запросы. На самом деле, теперь, когда я перечитал ваш вопрос, это заставляет меня думать, что ваш скрипт установки cookie уже выделенная страница? Или вы просто «включаете» в реальный контент, обслуживаемый другим php-скриптом? Если нет, попробуйте этот подход. Также это было бы полезно, если у вас есть правила ведения журнала по умолчанию для Apache, если куки установлены на собственной странице, ваш Apache зарегистрирует для этого строку, а в системах с высокой нагрузкой это будет накапливать общее время, затрачиваемое на Apache.

Кроме того, учтите, что тестирование, если cookie установлен и затем его установка, может быть медленнее, чем просто принудительно устанавливать его всегда, даже если cookie существует или нет?

Но в целом, я не думаю, что вам нужно было бы настраивать сервер только для того, чтобы разгрузить создание файлов cookie, не зная больше о том, как вы сейчас обращаетесь с файлами cookie. Если только вы не делаете что-то действительно неприятное.

0 голосов
/ 09 мая 2011

В Apache есть модуль mod_usertrack , который выглядит так, как будто он может делать именно то, что вы хотите.PHP не нужен, и вы, вероятно, могли бы создать действительно оптимизированную облегченную конфигурацию Apache для этого.

Если вы хотите пойти на что-то еще быстрее и рады, что не используете Apache, вы можете использовать lighttpd, и это mod_usertrack или nginx's HttpUserId module

0 голосов
/ 07 мая 2011

Вы можете попробовать использовать mod_headers (обычно доступно при установке по умолчанию), чтобы вручную создать заголовок Set-Cookie и создать его - программирование не требуется , покакаждый раз одно и то же печенье .Примерно так может работать в файле .htaccess:

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

Однако это не сработает для вас.Там нет кода здесь.Это просто тупой заголовок.Он не может найти новое случайное значение, которое вам нужно, и он не может настроить дату истечения срока, как это принято в стандартной практике.

Это будет сервер Apache, возможно выделенный, содин PHP-скрипт длиной 3 строки, просто повторяющийся снова и снова.[...] Конечно, должен быть более быстрый и лучший способ сделать это, чем запускать всю среду PHP.

Используете ли вы APC или другой кеш байт-кода?Если это так, почти не имеет стартовой стоимости .Поскольку вы говорите о настройке всего сервера только для этого, похоже, вы также управляете сервером.Это означает, что вы можете отключить apc.stat для еще меньшего количества попаданий при запуске.

Действительно, если все, что делает этот скрипт, это создание хеша md5 и установка cookie, это должно быть невероятно быстро , особенно если это mod_php.Вы уже знаете, несмотря на тестирование и тестирование, что скрипт работает не так хорошо, как хотелось бы?Если да, можете ли вы поделиться с нами этими критериями?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...