2014-11-17 1 views
1

В некоторых языках C# или .NET это будет статическая переменная, но в PHP память очищается после каждого запроса. Я хочу, чтобы значение сохранялось во всех запросах. Я не хочу $ _SESSION, потому что это отличается для каждого пользователя.PHP Персистская переменная во всех запросах

Чтобы помочь объяснить, вот пример: Я хочу, чтобы такой скрипт подсчитывался. Независимо от того, какой пользователь/браузер открывает URL-адрес.

<?php 
function getServerVar($name){ 
    ... 
} 
function setServerVar($name,$val){ 
    ... 
} 
$count = getServerVar("count"); 
$count++; 
setServerVar("count", $count); 
echo $count; 

Я хочу, чтобы значение хранилось в памяти. Это не будет то, что необходимо сохранить, когда apache перезагружается, а данные не так важны, что он должен быть потокобезопасным.

ОБНОВЛЕНИЕ: Я в порядке, если он имеет разные значения для каждого сервера в балансировочной среде. Статические переменные в C# или Java также не синхронизируются.

+0

Вы собираетесь использовать что-то вроде redis или memcached. Это будет хранить все, что вы хотите на стороне сервера, и к ним могут быть доступны все пользователи. – slapyo

+1

http://stackoverflow.com/questions/21947595/php-session-like-storage-global-across-all-users – Cheery

+0

Похоже, что я хочу shm_get_var, shm_set_var из http://stackoverflow.com/questions/ 21947595/php-session-like-storage-global-all-users-пользователи – Eric

ответ

1

Обычно вы использовали базу данных для хранения счета.

Однако в качестве альтернативы вы могли бы сделать это с помощью файла:

<?php 
$file = 'count.txt'; 
if (!file_exists($file)) { 
    touch($file); 
} 

//Open the File Stream 
$handle = fopen($file, "r+"); 

//Lock File, error if unable to lock 
if(flock($handle, LOCK_EX)) { 
    $size = filesize($file); 
    $count = $size === 0 ? 0 : fread($handle, $size); //Get Current Hit Count 
    $count = $count + 1; //Increment Hit Count by 1 
    echo $count; 
    ftruncate($handle, 0); //Truncate the file to 0 
    rewind($handle); //Set write pointer to beginning of file 
    fwrite($handle, $count); //Write the new Hit Count 
    flock($handle, LOCK_UN); //Unlock File 
} else { 
    echo "Could not Lock File!"; 
} 

//Close Stream 
fclose($handle); 
+0

Также можно использовать sqlite, если вы собираетесь использовать файл в любом случае. – Mike

+0

@Mike cana shoulda willa – Petah

0

В php вам придётся использовать внешний магазин, доступный всем серверам. Наиболее часто используемый инструмент memcached, но sql и redis работают отлично для этого варианта использования.

0

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

Файл, используемый как $ _SESSION, будет работать, если у вас есть только один сервер для получения ваших запросов. Для более чем одного сервера вам нужен любой тип базы данных, с которой будут взаимодействовать все ваши серверы.