【问题标题】:What can I use for quick temporary storage in PHP我可以在 PHP 中使用什么来快速临时存储
【发布时间】:2011-12-03 21:24:06
【问题描述】:

我正在创建一个处理一些图像的小插件。现在要向用户报告进度,我有一个小的 ajax 脚本,它将长轮询结果。

现在实习生我需要一个对象来跟踪处理的内容。现在我知道的选项如下。

使用 PHP 会话 对象。在这种特定情况下我不能使用它,因为初始过程也是由 ajax 完成的。所以主进程是一个ajax调用,而long poll ajax是另一个ajax调用。他们有 2 个不同的会话 id,所以他们不能很好地交流。

第二种选择是使用数据库作为存储。我不知道这是否很好,因为平均工作中大约有 40 次读/写。我知道这没问题,但对于这么简单的事情来说似乎有点过分。

如果可能的话,我实际寻找的是一种内存对象。在内存中创建一个小对象,它会随着进度快速更新并在我们完成后删除。

我不知道这是否可能,PHP中存在这样的东西,我可以利用它。请注意,这将是一个公共插件,因此我需要使用在所有类型的系统上都可用的方法,没什么特别的。

【问题讨论】:

  • 可能是Memcached?我也没有关注你的会话问题。
  • 使用 cookie(它将保存在客户端计算机本地)
  • @JaredFarrish 会话保存在服务器上,读取和写入它们需要很长时间
  • @micha - 哦,我明白了,这是一个会话超时问题。 Cookies 可能是一个不错的选择,或者是一个临时表。也许是 LocalStorage?
  • 会话的问题是我得到了 2 个不同的会话 ID。我花了一个小时才弄清楚,我也没有意识到这个问题,但是会话不起作用。我猜两个 ajax 调用会生成 2 个不同的会话 ID。再一个 cookie 就太多了。

标签: php storage


【解决方案1】:

我认为数据库不是更糟糕的解决方案。如果您认为写入磁盘,可能会更糟。

Memcache 不错,但是你需要一个在win、linux、mac等上轻松运行的“免外接插件”小插件……不是一个好选择。

如果你使用Mysql,你可以使用Memory engine tables,witch速度很快,并通过一个简单的垃圾收集器算法定期截断或清理它。如果内存表不是一个选项,innodb 就足够了。

【讨论】:

  • 是的,我认为 memchached 不是最好的解决方案。内存表看起来是个好主意。我会稍微研究一下。我认为我不需要定期垃圾收集器,因为我可以在脚本运行完成后立即清理。
  • 你是否有一个关于如何准确使用内存引擎表的好链接。
  • 垃圾收集器可以帮助您处理在处理结束之前离开页面/进程的进程或用户。它也可以清理存储在操作系统临时文件夹之外的临时文件。
  • 要使用内存表只需使用CREATE TABLE ( <fields> ) ENGINE=Memory;,您可以check here了解更多信息。
【解决方案2】:

您可以为此使用内存缓存。 http://php.net/manual/en/book.memcache.php 作为密钥,您可以使用图像文件的 md5 哈希加上用户 ip。

【讨论】:

  • 你认为我可以在公共插件中依赖它吗?这是普遍可用的东西,还是只对某些用户可用的东西。
  • Memcache 并非在所有 PHP 服务器上都可用,但它被广泛使用,许多应用程序都依赖它。您的插件可以检查它在服务器上是否可用,如果不可用,则回退到使用临时文件(以密钥作为文件名)。
【解决方案3】:

看看Redis“一个开源的高级键值存储”,我想你会喜欢的。

您需要运行一个 Redis 服务器,并使用不同的clients 访问它。 PHP 的首选客户端是Predis。用法很简单:

 $client = new Predis\Client($single_server);

 $client->set('library', 'predis');
 $retval = $client->get('library');

【讨论】:

  • 如果我的插件是供个人使用的,这将是一个不错的选择。但我正在开发一个可供 wordpress 用户使用的公共插件。我不能依赖这个,因为我认为没有多少人会有性病。
  • +1 没问题,这当然是我可以在我的个人项目中使用的东西,这是一个了不起的想法。感谢您的提示。
【解决方案4】:

当您使用堆表时,数据库不是一个坏主意。有时您只是在服务器上没有内存缓存。
检查Memory Tables at MySQL documentation

【讨论】:

  • 是的,我也在想同样的事情。如果可用,也许使用 memcached,否则回退到普通数据库。
  • 我认为没有必要检查memcache是​​否可用。内存表的读/写操作几乎和 memcache 一样快。多做,少写;)
  • 但是在适当的编程方面。数据库是否适用于这样的事情。这将是一个仅持续一分钟的对象,而不是实际数据。
  • 数据库不过是保存数据的结构。 Memcache 也是某种数据库。有时数据库用于存储用户会话,那么为什么不使用它来存储临时值。无论如何,在我看来,这种表是为此类事情创建的。
【解决方案5】:

您想要简单高度便携、php 进程之间的共享内存,而不管php 是如何安装的?使用 mysql 内存表。没有安装 mysql 的 php 非常少见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2011-01-29
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    相关资源
    最近更新 更多