【问题标题】:PHP - APC Cache - User specific data vs data accessible by all usersPHP - APC 缓存 - 用户特定数据与所有用户可访问的数据
【发布时间】:2011-07-13 12:53:14
【问题描述】:

我已经阅读了几个网站上的一些教程以及 StackOverFlow 上有关该主题的一些问题,但我仍然无法找到我的问题的明确答案。

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

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

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

谢谢!

【问题讨论】:

  • Matt:只缓存代码,不缓存内存。所以这是变量的名称,而不是它们的内容。

标签: php caching apc


【解决方案1】:

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

注意: 自 PHP 5.5 版起,它带有自己的 OPCode Cache Core Extension,名为 Opcache。非正式地不推荐使用 APC 进行操作码缓存。有关详细信息和选项,请咨询您的系统管理员或 Opdesk,无论扩展名如何,此答案中概述的一般原则仍然适用。

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

因此,如果没有字节码缓存,则需要在每次请求时编译字节码。使用字节码缓存,此步骤只需在所有请求中执行一次。下次字节码已经在缓存中,可以直接执行。

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

【讨论】:

  • 谢谢 hakre,现在更清楚了。您说它保存变量的名称 - 而不是内容。数组呢?如果我有一个包含的文件,例如include_once('code.php') 和 code.php 我有一个包含几十个值的数组。 APC 会不会记住那些值?有没有办法通过 APC 将这些数组保存在内存中?
  • @Hahkre 我相信您也可以使用 [apc-store][ php.net/manual/en/function.apc-store.php] 存储数据
  • @OZ_:我认为bytecode 更适合 PHP 解释器世界,但它是字节码 php-processor-op-code ;)
  • @Matt:数组只是一个变量,就像任何其他变量一样。所以它是一样的。并且每个文件都被编译和缓存,所以对于includes也是如此。
  • 答案具有误导性,因为 APC 既是字节码缓存又是数据缓存。事实上,由于 PHP5.5 现在有 OpCache,APCu 的后继者只是一个数据缓存。
【解决方案2】:

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?

您可以使用apc_store 将数据存储在内存中,可以使用apc-fetch 检索这些数据。它不会将所有变量都存储在程序中。

bool apc_store ( string $key , mixed $var [, int $ttl = 0 ] )

注意:与 PHP 中的许多其他机制不同,变量存储使用 apc_store() 将在请求之间持续存在(直到删除该值 从缓存中)。

参数

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

通过阅读文档,我假设您必须像在 memcached/redis 中一样提供唯一键。要将数据存储为私有,您只需获取session_id(每个会话唯一)并将其用作前缀。您使用key 来存储您的数据。 This Redis tutorial from Simon Willison 也有一节描述如何使用键,我将在下面引用:

Redis 本质上是一个键值存储,所以从一开始就有意义 谈论钥匙。键不应包含空格 - 的版本 Redis 1.2 之前的版本有这个问题,即使现在也不是 保证任何边缘情况的错误都已被解决。普通的 约定是使用 obj-type:id:field,尽管现在 Redis 支持 哈希作为值,这种约定可能变得不那么重要了。

【讨论】:

    【解决方案3】:

    我也有同样的问题。但关键是这个。 APC 不将用户视为最终用户,即 John Smith,而是将其视为应用程序本身。因此,当 APC 说用户特定数据时,您可以存储“用户特定数据”,即 APC 中有关该特定应用程序的 mywebsite.com 信息。它不适合人们。它适用于一个程序,基本上将变量信息发送给另一个程序。

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 2013-09-25
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多