【发布时间】:2010-11-29 06:10:29
【问题描述】:
我需要一种简单的方法让多个正在运行的 PHP 脚本共享数据。
我应该创建一个带有 RAM 存储引擎的 MySQL 数据库,并通过它共享数据(多个脚本可以同时连接到同一个数据库吗?)
或者每行包含一条数据的平面文件会更好吗?
【问题讨论】:
标签: php sql mysql performance flat-file
我需要一种简单的方法让多个正在运行的 PHP 脚本共享数据。
我应该创建一个带有 RAM 存储引擎的 MySQL 数据库,并通过它共享数据(多个脚本可以同时连接到同一个数据库吗?)
或者每行包含一条数据的平面文件会更好吗?
【问题讨论】:
标签: php sql mysql performance flat-file
平面文件?呜呜呜……
使用良好的数据库引擎(MySQL、SQLite 等)。然后,为了获得最佳性能,请使用 memcached 来缓存内容。
请记住几件事:
【讨论】:
为了维护者的理智,请不要使用平面文件。
如果您只是希望尽可能快地共享数据,并且可以将其全部保存在 RAM 中,那么memcached 是完美的解决方案。
如果您希望数据持久化,请使用 DBMS,例如 MySQL。
【讨论】:
一般来说,数据库更好,但是,如果您要共享少量且大部分是静态的数据,则使用平面文件可能会带来性能优势(和简单性)。
除了琐碎的数据共享之外的任何东西,但是我会选择一个数据库。
【讨论】:
1- 平面文件有用的地方: 平面文件可以比数据库更快,但在非常特定的应用程序中。 如果从头到尾读取数据而不进行任何搜索或写入,它们会更快。 如果数据不适合内存并且需要完全读取才能完成工作,它“可以”比数据库更快。此外,如果写入多于读取,平面文件也会发光,大多数默认数据库设置将需要使读取查询等待写入完成以维护索引和外键。使写入查询通常比简单的读取要慢。
TD/LR 版本: 将平面文件用于基于作业的系统(也就是简单的日志解析),而不是用于网络搜索查询。
2- 平面文件坑掉: 如果您使用平面文件,则需要在文件更改时使用自定义锁定机制同步脚本。如果您有错误,这可能会导致速度变慢、损坏甚至死锁。
3- 基于 Ram 的数据库? 大多数数据库都有用于查询结果、搜索索引的内存缓存,这使得它们很难用平面文件击败。因为它们缓存在内存中,所以让它完全从内存中运行在大多数情况下是无效和危险的。更好地调整数据库配置。
如果您希望使用 ram 优化性能,我会首先考虑从 ram 驱动器运行您的 php 脚本、html 页面和小图像。缓存机制更可能是粗糙的并且系统地命中硬盘驱动器以获得不变的静态数据。
使用负载平衡器可以获得更好的结果,通过背板连接到基于内存的 SAN 阵列进行集群。但这完全是另一个话题。
5- 多个脚本可以同时连接到同一个数据库吗?
是的,它称为连接池。在 php(客户端)中,它的功能是打开连接的 mysql-pconnect(http://php.net/manual/en/function.mysql-pconnect.php)。 我认为您可以在 php.ini 中配置最大打开连接。 mysql服务器端的类似设置定义了/etc/mysql/my.cnf中的最大并发客户端连接数。
您必须这样做以利用 cpu 的并行处理并避免 php 脚本等待彼此的查询完成。它极大地提高了重负载下的性能。
Apache 配置中还有一个用于常规 Web 客户端的连接池/线程池。请参阅 httpd.conf。
对不起,文字墙,很无聊。 路易斯。
【讨论】:
如果您在多台服务器上运行它们,则基于文件系统的方法将无法解决问题(除非您拥有一致的共享文件系统,这不太可能并且可能不可扩展)。
因此,无论如何您都需要一个基于服务器的数据库来允许在 Web 服务器之间共享数据。如果您非常重视性能或可用性,您的应用程序将支持多个 Web 服务器。
【讨论】:
我会说 MySql DB 会是更好的选择,除非您有一些机制来处理平面文件上的锁定(以及一些控制访问的方法)。在这种情况下,DB 层(不管特定的 DBMS)充当间接层,让您不必担心。
由于 OP 没有指定 Web 服务器(PHP 实际上可以从命令行运行),所以我不确定缓存技术是否就是他们所追求的。 OP 可能正在寻求进行某种非网站驱动的飞行数据转换。谁知道呢。
【讨论】:
如果您的系统有 PHP 缓存(将已编译的 PHP 代码缓存在内存中,例如 APC),请尝试将您的数据作为 PHP 代码放入 PHP 文件中。如果一定要写数据,就会存在一些安全问题。
【讨论】:
我需要一个简单的方法来处理多个 运行 PHP 脚本来共享数据。
APC 和 memcached 都是不错的选择,具体取决于上下文。 shared memory 也可能是一个选项。
我应该创建一个带有 RAM 的 MySQL 数据库吗 存储引擎,并通过共享数据 那(可以多个脚本连接到 同时使用同一个数据库?)
这也是一个不错的选择,但可能不如 APC 或 memcached 快。
或者将平面文件与一块 每行数据更好?
如果这是只读数据,这是可能的 - 但可能比上述任何选项都慢。特别是如果数据很大。然而,与其编写自定义解析代码,不如考虑简单地构建一个 PHP 数组,然后 include() 文件。
如果这是一个可以被多个写入者同时访问的数据存储,千万不要使用平面文件!从多个进程写入平面文件可能会导致文件损坏。您可以锁定文件,但可能会出现锁定争用问题和较长的锁定等待时间。
处理并发写入是 mysql 和 memcached 等应用程序存在的原因。
【讨论】: