2010-05-28 3 views
1

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

+0

Почему файлы и базы данных неэлегантные? – thetaiko

+0

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

ответ

5

Если вам нужно сохранить глобальное состояние, вам нужно сохранить глобальное состояние. Обычно это делается либо в файле, либо в базе данных, как вы уже отметили.

+0

Хмммм. В asp.net существует понятие состояния приложения, которое в основном представляет собой кеш памяти, который разделяется всеми reqests. Это было бы идеальным местом для хранения количества онлайн-пользователей, если вы спросите меня. –

+0

Проблемы: а) ASP, к сожалению, не PHP. б) Состояние приложения неустойчиво. Это может быть или не быть проблемой.В случае счётчика, это будет большой проблемой. К сожалению, нет ничего, что было бы прямым аналогом состояния приложения в PHP, поэтому разговор в любом случае несколько спорный. –

0

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

2

Это совсем не «неэлегантный». Если вам нужно что-то сохранить (полу), вы поместите его в базу данных. Для этого нужны базы данных.

1

Посмотрите на функцию сериализации() в PHP http://uk3.php.net/serialize, где вы будете иметь возможность записать массив или такое файл и повторно получить:

<?php 
    // Save contents 
    $var = array('pageCounter' => 1); 
    file_put_contents('counter.txt', serialize($var)); 

    // Retrieve it 
    $var = unserialize(file_get_contents('counter.txt')); 
?> 

В противном случае сохранения значения в базе данных ,

+0

Да, спасибо, я уже делаю что-то очень похожее. –

0

Вы могли бы попытаться установить APC (Alternative PHP Cache), который имеет интересные функции для обмена данными между всеми PHP сценариев, вы можете попробовать использовать общую память слишком или, как вы сказали, используйте файл или базу данных

+0

Это интересный вариант. –

0

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

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

// Fetch counter value back from memory 
$success = false; 
$counter = apc_fetch('counter', &$success); 
if ($success) { 
    // fetch succeeded 
} else { 
    // fetch failed 
    $counter = 0; 
} 

// Increment the counter and store again 
// Note that nothing stops another request/page from changing this value 
// between the fetch and store calls. 
$counter++; 
apc_store('counter', $counter); 

Это просто пример. Для счетчика вам лучше использовать apc_inc('counter')/apc_dec('counter').

Предположительно, другие кеши оп-кода имеют аналогичные методы. Если вы не используете кеш-код операции ... действительно? Вы хотите, чтобы PHP перекомпилировал страницу каждый раз, когда ее запрашивали?

+0

Большое спасибо. Очень интересно. Я это рассмотрю. –

+0

Извините, я забыл ссылаться на страницы руководства для этих страниц. Вот основная страница руководства по функциям APC на php.net: http://www.php.net/manual/en/ref.apc.php – Powerlord

0

Я думаю, что нашел ответ - session_name ('whatever') можно использовать для фиксированного имени для сеанса, я могу ссылаться на эти данные, а также на сеанс, специфичный для сеанса.

0

Элегантный, нет базы данных и нет файлов?

Сохраните его на своей серверной памяти с помощью shmop и надейтесь, что ваш сервер не перезагрузится!

Смежные вопросы