保存变量(不是会话)

保存变量(不是会话)

问题描述:

这可能是一个愚蠢的问题,但如何保存不特定于特定会话的变量。一个简单的例子说明为什么你可能想要做到这一点将是一个访客计数器 - 每次有人访问一个网页时增加一个数字(注意 - 我实际上没有这样做,我的应用程序是不同的,但这是我需要的功能)。我能想到的唯一方法是将变量写入文件或将变量放入数据库中。两者都显得有点不雅。有没有更好的方式来这样的事情?保存变量(不是会话)

+0

为什么文件和数据库不雅? – thetaiko 2010-05-28 13:37:07

+0

当我只想存储每个会话使用的一些变量时,它似乎不是一个整洁的选项。我只是想知道是否有另一种方式来做到这一点。 – 2010-05-28 13:45:08

如果需要保存全局状态,则需要保存全局状态。正如您已经注意到的,这通常在文件或数据库中完成。

+0

嗯。在asp.net中有应用程序状态的概念,它基本上是一个由所有请求共享的内存缓存。如果你问我,这将是存储当前在线用户数量的理想场所。 – 2010-05-28 13:35:59

+0

问题:a)ASP很遗憾不是PHP。 b)应用程序状态是不稳定的。这可能是也可能不是问题。在计数器的情况下,这将是一个大问题。不幸的是,在PHP中没有什么是应用程序状态的直接模拟,所以对话有点不切实际。 – 2010-05-28 13:40:17

鉴于PHP是无状态的,并且每个页面负载基本上都是重新运行您的页面,如果您要保存将在多个页面负载(例如,不同用户数量)上递增的变量,您将拥有使用某种形式的服务器端存储 - 基于文件,数据库,不管 - 来保存变量。

这根本不是“不雅”。如果您需要永久保存某些内容(半),请将其放入数据库中。这就是数据库的用途。

看一看在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

是的,谢谢我已经在做一些非常相似的事情。 – 2010-05-28 13:40:47

你可以尝试安装这对于所有的PHP脚本之间共享数据很酷的功能,APC(替代PHP缓存),你可以尝试使用共享内存过多或像你说的,使用一个文件或数据库

+0

这是一个有趣的选项谢谢。 – 2010-05-28 13:42:19

如果你想它是永久的,数据库和文件是你唯一的两个选择。

如果你只希望这些值暂时存储在内存中,如果安装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

非常感谢。很有意思。我会考虑的。 – 2010-05-28 13:46:10

+0

对不起,我忘了链接到这些页面的手册页面。以下是php.net上的主要APC功能手册页面:http://www.php.net/manual/en/ref.apc.php – Powerlord 2010-05-28 13:47:40

我想我已经找到了答案 - session_name('whatever')可以用来为会话指定一个固定名称,我可以引用该数据以及特定于会话的会话。

优雅,没有数据库,没有文件?

将其存储在您的服务器内存中shmop并希望您的服务器不会重新启动!