Я ищу простой способ хранения счетчика в памяти сервера, чтобы разрешить выбор загрузки страницы, тип (псевдокод):
if counter is odd then load page-x else (even counter) load page-y increment counter by 1 store counter in server's memory
Переменные сеанса не помогли бы, среди нескольких пользователей.
Я понимаю, что это может быть достигнуто с сохранением поля в базе данных, но это похоже на затуманенный подход. Интересно, что-то быстрее.
Вот почему я подумал о некоторых переменных на стороне сервера, которые хранятся в памяти через сеансы ….
Если у вас уже установлено соединение с базой данных, я бы подумал об использовании этого. Я не могу себе представить, что запрос одной строки может дать вам проблемы с производительностью при любой загрузке.
Если вы не хотите этого делать, простой и быстрый подход к вашей проверке «нечетный / четный» может использовать временный файл.
Если файл существует, условие является «нечетным»,
Если оно не существует, условие является «четным»,
убедитесь, что вы создали чек против состояния гонки двух экземпляров, пытающихся создать или удалить один и тот же файл в одно и то же время – вы должны убедиться, что сценарий не сбой в этом случае.
Очевидно, что это решение сохраняется даже при перезагрузке сервера.
Используйте APC, xCache или memcache для сохранения переменных в кеш вместо базы данных. Обратите внимание, однако, что сброс сервера приведет к уничтожению этих значений.
То, что вы имеете в виду, это тестирование A / B. Обычно у вас есть файл cookie, который отслеживает входящего посетителя, а затем определяет, следует ли обслуживать версию A или версию B.
Причина, по которой вы будете использовать cookie, состоит в том, что, если пользователь посещает ту же страницу и получает альтернативную версию, они будут запутаны. Использование cookie поместит посетителя в текстовую группу A или тестовую группу B и будет обслуживать соответствующую страницу каждый раз, когда они посещают (до тех пор, пока живет файл cookie).
Для истинно 50/50 легко используйте файл:
$pageToShow = file_get_contents("whatever.dat"); if ($pageToShow == "A") { // show page a file_put_contents("whatever.dat", "B"); } else { // show page b file_put_contents("whatever.dat", "A"); }
Очевидно, сначала создайте файл с буквой «А» в нем.
Приветствия.
Как насчет расширения общей памяти, если это так просто?
Memcached обычно используется для кэширования данных, а также распределяется по всем параметрам. Вы можете начать чтение с страниц расширения PHP memcache .
В дополнение к тому, что уже упоминалось, взгляните на
или в Руководстве по PHP:
Вместо использования базы данных вы можете просто использовать кеша-меканизм (как предлагается в другом ответе) или просто сохранить свое значение в текстовом файле. Это будет медленнее, чем кеш, но имеет преимущество, сохраняющееся даже после сброса сервера.
Кажется, вы пытаетесь выполнить A / B-тестирование, посмотрели ли вы в Оптимизатор веб-сайта Google , который позволяет вам делать довольно подробную аналитику A / B.
Вы можете проверить разные страницы или разделы страниц и выяснить, какой из них приведет к большему количеству конверсий.
Я знаю, что этот ответ напрямую не отвечает на ваш технический вопрос, но он может решить фактическую проблему, которую вы пытаетесь решить.
Если это случайно, что вы хотите обслуживать A или B, вы можете использовать простой переключатель времени доступа:
<?php if (filemtime(".switch") % 2): require "A"; else: require "B"; endif; touch(".switch");
Это, очевидно, не служит жестким решением 50/50.