PHP-APC缓存-用户特定数据与所有用户可访问的数据

PHP-APC缓存-用户特定数据与所有用户可访问的数据,php,caching,apc,Php,Caching,Apc,我已经在几个网站上阅读了一些教程,还有一些关于StackOverFlow的问题,但我仍然找不到一个明确的答案 我想知道APC Cache如何管理/保存特定于用户的数据(php代码中将使用的变量,这些变量是特定于用户的。换句话说,其他用户不应该看到的数据。)以及它如何保存所有用户都可以看到的公开可用数据 我只是想了解它是如何工作的。我知道APC“保存”或在内存中保存所需和包含的文件。。。但是如果这些包含的文件在代码中有用户特定的变量呢?假设在/account/user_profile.php中,我

我已经在几个网站上阅读了一些教程,还有一些关于StackOverFlow的问题,但我仍然找不到一个明确的答案

我想知道APC Cache如何管理/保存特定于用户的数据(php代码中将使用的变量,这些变量是特定于用户的。换句话说,其他用户不应该看到的数据。)以及它如何保存所有用户都可以看到的公开可用数据

我只是想了解它是如何工作的。我知道APC“保存”或在内存中保存所需和包含的文件。。。但是如果这些包含的文件在代码中有用户特定的变量呢?假设在/account/user_profile.php中,我使用了几个变量,比如$firstname$lastname$address等。这些变量会保存在内存中吗?例如,如果在更新或保存缓存时John X已登录,那么APC将始终将John记为$firstname,将X记为$lastname?如果其他用户访问同一页面,我希望他查看其用户配置文件的详细信息,而不是John的

我知道这可能已经讨论过了,但我需要一个明确的答案


谢谢大家!

您对APC缓存有错误的理解。它是字节码缓存,这意味着它将存储PHP脚本的字节码。这将在下次从脚本中再次创建字节码时保存PHP解释器,因为它已经存在了

注意:自PHP版本5.5以来,它附带了自己的操作码缓存核心扩展,名为。非正式地反对使用APC进行操作码缓存。有关详细信息和选项,请咨询您的系统管理员或Opdesk,无论扩展名如何,本回答中概述的一般原则仍然适用

在正常的PHP执行中,脚本代码将被提取并编译成字节码。这个字节码将由php处理器执行。这是JIT编译器的常见模式

因此,在没有字节码缓存的情况下,每个请求都需要编译字节码。对于字节码缓存,此步骤只需在所有请求中执行一次。下次字节码已经在缓存中,可以直接执行


这与变量内容完全无关,只是为了代码。

p.s:我从未使用过APC(之前我切换到不同的语言,我真的理解APC的重要性),但我想我理解这个概念。如果我在某处撒谎,请纠正我。

> I am wondering how APC Cache manages/saves the user-specific data
> (variables that will be used in the php code, that are user-specific.
> In other words, data that should not be seen by other users.) and how
> does it save the publicly available data that all users can see?
您可以使用将数据存储在内存中,可以使用检索。它不会在程序中存储所有变量

bool apc_store ( string $key , mixed $var [, int $ttl = 0 ] )
注意:与PHP中的许多其他机制不同,使用 apc_store()将在请求之间保持(直到删除该值) 从缓存中)

参数

钥匙

使用此名称存储变量。密钥是缓存唯一的,因此 具有相同键的第二个值将覆盖原始值

通过阅读文档,我假设您必须提供唯一的密钥,就像在memcached/redis中一样。要存储私有数据,只需获取(每个会话唯一)并将其用作前缀。您可以使用
存储数据。还有一节介绍如何使用密钥,我将在下面引用:

Redis本质上是一个键值存储,因此从 谈论钥匙。键不应包含的空白版本 1.2之前的Redis在这方面有问题,即使现在也没有 保证任何边缘案例缺陷都已解决。普通的 惯例是使用obj type:id:field,尽管现在Redis支持 散列作为值,这种约定可能会变得不那么重要


我也有同样的问题。但关键是这个。APC认为用户不是最终用户,即John Smith,而是应用程序本身。因此,当APC表示特定于用户的数据时,您可以存储“特定于用户的数据”,即APC中有关mywebsite.com的特定应用程序的信息。这不是为人们准备的。这意味着一个程序基本上向另一个程序发送变量信息

马特:只有代码被缓存,而不是内存。这是变量的名称,但不是它们的内容。谢谢hakre,现在更清楚了。您说过它保存变量的名称,而不是内容。阵列呢?如果我有一个包含的文件,例如include_once('code.php'),在code.php中,我有一个包含几十个值的数组。APC不会记住这些值吗?有没有办法用APC将这些数组保存在内存中?@Hahkre我相信你也可以使用[APC store]来存储数据[@OZ:我认为它更适合PHP解释器世界,但是它是字节码和PHP处理器操作码;)@Matt:数组和任何其他变量一样只是一个变量。所以它是一样的。每个文件都被编译和缓存,所以对于include来说也是一样的。答案是误导性的,因为APC既是字节码缓存,也是数据缓存。事实上,一个s PHP5.5现在有了OpCache,APCu的后继版本只是一个数据缓存。