PHP – переменные на стороне сервера, которые будут «жить» навсегда?

Я ищу простой способ хранения счетчика в памяти сервера, чтобы разрешить выбор загрузки страницы, тип (псевдокод):

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 Dark Arts: разделенные сегменты памяти и
  • PHP Темные искусства: Семафоры

или в Руководстве по PHP:

  • Семафор, общая память и IPC

Вместо использования базы данных вы можете просто использовать кеша-меканизм (как предлагается в другом ответе) или просто сохранить свое значение в текстовом файле. Это будет медленнее, чем кеш, но имеет преимущество, сохраняющееся даже после сброса сервера.

Кажется, вы пытаетесь выполнить A / B-тестирование, посмотрели ли вы в Оптимизатор веб-сайта Google , который позволяет вам делать довольно подробную аналитику A / B.

Вы можете проверить разные страницы или разделы страниц и выяснить, какой из них приведет к большему количеству конверсий.

Я знаю, что этот ответ напрямую не отвечает на ваш технический вопрос, но он может решить фактическую проблему, которую вы пытаетесь решить.

Если это случайно, что вы хотите обслуживать A или B, вы можете использовать простой переключатель времени доступа:

 <?php if (filemtime(".switch") % 2): require "A"; else: require "B"; endif; touch(".switch"); 

Это, очевидно, не служит жестким решением 50/50.