【问题标题】:Handling big arrays in PHP在 PHP 中处理大数组
【发布时间】:2017-12-02 11:04:47
【问题描述】:

我正在处理的应用程序需要每小时两次获取最大约 10mb 的数据集。我们使用该数据集在网站上显示分页结果,也应该可以通过对象属性之一进行简单搜索。

目前我们正在考虑两种不同的实现方式

1.) 将 json 数据集存储在数据库中或文件系统中的文件中,读取并循环显示结果。

2.) 将 json 数据集存储在关系 MySQL 表中,并在需要显示它们时查询结果并循环。

如我所说,必须每小时多次更换/刷新结果。

这两种方式都有缺点。我正在尝试选择一种总体上不那么邪恶的好方法。在内存中读取 10 MB 并不是很多,另一方面,在我看来,每小时重写几次表可能会产生冲突。

我对 1.) 的担忧是,如果我们一直在内存中读取 10mb,那么应用程序的安全性如何?如果多个用户在某个时间点这样做会发生什么,这是需要担心的事情还是 PHP 能够在后台处理这个问题?

你认为这个用例最适合什么?

谢谢!

【问题讨论】:

  • 你有理由使用 PHP 吗?您的环境是否有任何长期运行的缓存服务,例如 memcached?您的代码是否有权创建 RAM 磁盘?
  • 该网站基于 PHP/WordPress,我们需要坚持下去。 Memcached是肯定可以安装的,你觉得有用吗?
  • 此时在我的脑海中,就像安装 Elastic search 与您的数据库连接一样,具有高效的缓存和内存实现。另一种方法是在内存中使用。但是您是否尝试过 maria DB,以关系方式存储您的数据,但以 json 方式存储一些数据。新的 mariaDB 支持 JSON 类数据及其操作。而且我认为 wordpress 也使用 json 类型的数据来存储一些数据。那么,为什么不在 maria DB 中拥有数据库。
  • 如果不知道显示和更新这个大型数据集所需的访问模式,很难给出好的建议。 SQL 的目的(MySQL 和其他此类服务器)是允许程序操作大型数据集,而无需将整个数据放入 RAM。如果可能,请edit您的问题告诉我们更多信息。另外,请告诉我们您的服务器上的 php 背后是什么。是阿帕奇吗? nginx?您可以控制服务器配置吗?

标签: php mysql arrays json memory


【解决方案1】:

当 php 在 web 服务器上运行时(通常是这样),服务器会在需要处理并发请求时按需启动新的 php 进程。一个强大的网络服务器可能允许五十个左右的 php 进程。如果他们每个人都在处理这个大型数据集,那么您需要有足够的 RAM 来存储 50 个副本。而且,您需要以某种方式为每个新请求加载该数据。从文件中读取 10mb 并不是一个压倒性的负担,除非您需要进行某种解析。但这是一种负担。

当它开始处理每个请求时,php 为编程环境提供了一个干净的上下文。 php 不擅长从一个请求到下一个请求维护内存中的上下文。您可能能够弄清楚如何做到这一点,但这是一个狡猾的解决方案。如果您在与其他 Web 应用程序(尤其是您不信任的应用程序)共享的服务器上运行,则不应尝试这样做;其他应用程序将可以访问您的内存数据。

你可以通过Apache或者nginx的配置设置来控制并发进程,限制为5个或者10个php.ini文件。但是如果你有很多传入的请求,这些请求会被序列化并且它们会变慢。

此应用程序需要扩大规模吗?您最终是否需要一个 Web 服务器池来处理您的所有请求?如果是这样,内存中的解决方案看起来更糟。

您的 json 数据看起来像一大堆对象吗?该数组中的大多数对象是否具有彼此相同的元素?如果是这样,那符合 SQL 表吗?您可以制作一个表格,其中的列对应于对象的元素。然后,您可以使用 SQL 避免在每次显示或更新数据时触及每一行——每个数组的每个元素。

(同样的逻辑适用于 Mongo、Redis 和其他存储数据的方式。)

【讨论】:

    猜你喜欢
    • 2012-01-11
    • 1970-01-01
    • 2012-09-23
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多