【问题标题】:php persistent service? [duplicate]php持久化服务? [复制]
【发布时间】:2011-12-15 02:26:23
【问题描述】:

可能重复:
Cache Object in PHP without using serialize

所以我建立了一个相当大的数据结构,它不能轻易地转换成关系数据库格式。使用这种数据结构,我发出的请求非常快,但加载到内存中大约需要 4-5 秒。我想要的是一次将它加载到内存中,然后让它坐在那里并能够快速回答单个请求,这当然不是我正常编写的 php 脚本的正常流程。有什么好的方法可以在php中做到这一点吗? (同样不使用数据库,它必须使用这种专门的预计算结构,这需要很长时间才能加载到内存中。)

编辑:This tutorial 提供了我想要的东西,但它非常复杂,我希望有人能提供更优雅的解决方案。正如他在教程中所说,整个问题是 php 自然是无状态的。

【问题讨论】:

  • 在 PHP 中创建一个 webserver(已经存在),在服务器启动时加载结构,然后响应请求。数据已经可用。
  • 抱歉,我是 PHP 方面的新手……在 PHP 中创建网络服务器是什么意思?现在的设置是用户转到一个页面,apache 为该页面运行 php 脚本...
  • @hackartist nanoweb.si.kz this... 它位于 apache 的 80 端口(或任何您设置的端口)上。所以你在 PHP 中获取请求并处理它。我看到的一个问题是 PHP 没有线程......所以对于并发,它必须自己分叉(这很好,只要你知道你在做什么......)
  • 如何将数据存储在 APC (php.net/manual/en/apc.configuration.php) 中?那么你基本上只是在内存中工作。
  • 感谢有关 APC 的提示。这看起来很有希望

标签: php web-services data-structures persistence


【解决方案1】:

您绝对必须按照您的链接教程的建议进行操作。

请求之间没有 PHP 状态持续存在。这是设计使然。

因此,您将需要某种单独的长时间运行的进程,从而需要某种 IPC 方法,否则您需要更好的数据结构,您可以分段加载。

如果您真的不能将其放入关系数据库(例如sqlite--不一定是流程数据库),请探索使用其他类型的数据库,例如file-based key-value store。

请注意,您使用任何语言编写的任何长时间运行的过程都极不可能比将您的这种数据结构放入真正的数据库、关系数据库更快、更容易或更好否则!将您的数据结构放入数据库!这是您可能的路径中最简单的。

您可以做的另一件事就是尽可能快地加载您的数据结构。您可以将其序列化为文件,然后对文件进行反序列化;如果这还不够快,您可以尝试igbinary,它是一个比标准 php 序列化器快得多的序列化器。

【讨论】:

  • 感谢您的建议,如果找不到其他解决方案,我将尝试重构我的数据结构。我的数据结构是一个大的(特定于问题的)索引,有点像后缀树,将它放在内存中比尝试在数据库中遵循路径要快得多,即使我可以为它提出一个很好的表示在关系模型中。然而,我想得越多,我真的不需要服务只是数据结构,要持久。如果数据结构已经在内存中快速访问,我仍然可以让 php 请求模型完成它的工作。
  • 你不明白——没有办法将这种数据结构持久地放入 PHP 进程空间!每次请求后都会清除进程空间。您需要一些序列化步骤,IPC 或内存映射文件或数据库或其他任何东西。您不能将整个内容加载到原生 PHP 对象中并永远保留它。
  • APC 是个好建议,顺便说一句,但你仍然需要a serialization-deserialization step。您实际上是在使用 APC 作为内存数据库。
  • 还不错。感谢您帮助我理解这一点。
猜你喜欢
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
相关资源
最近更新 更多