7

我需要一种简单的方法让多个正在运行的 PHP 脚本共享数据。

我应该创建一个带有 RAM 存储引擎的 MySQL 数据库,并通过它共享数据(多个脚本可以同时连接到同一个数据库吗?)

或者每行包含一个数据的平面文件会更好吗?

4

8 回答 8

15

平面文件?不...

使用良好的数据库引擎(MySQL、SQLite 等)。然后,为了获得最佳性能,请使用 memcached缓存内容。


通过这种方式,您可以轻松可靠地使用经过验证的处理并发等的服务器软件在进程之间共享数据......但是您可以获得缓存数据的速度。

请记住几件事:

  1. MySQL 有一个查询缓存。如果您重复发出相同的查询,则无需添加缓存层即可获得很多性能。
  2. 无论如何,MySQL 真的很快。您是否进行了负载测试以证明它不够快?
于 2009-09-17T18:23:22.527 回答
6

为了维护者的理智,请不要使用平面文件。

如果您只是希望尽可能快地共享数据,并且可以将其全部保存在 RAM 中,那么memcached是完美的解决方案。

如果您想要数据的持久性,请使用 DBMS,如 MySQL。

于 2009-09-17T18:23:34.633 回答
2

通常,数据库更好,但是,如果您共享少量的、大部分是静态的数据,则使用平面文件可能会带来性能优势(和简单性)。

除了琐碎的数据共享之外的任何东西,但是我会选择一个数据库。

于 2009-09-17T18:24:58.640 回答
2

1-平面文件的用处:平面文件可以比数据库更快,但在非常特定的应用程序中。如果从头到尾读取数据而不进行任何搜索或写入,它们会更快。如果数据不适合内存并且需要完全读取才能完成工作,它“可以”比数据库更快。此外,如果写入多于读取,平面文件也会发光,大多数默认数据库设置将需要使读取查询等待写入完成以维护索引和外键。使写入查询通常比简单读取要慢。

TD/LR vesion:将平面文件用于基于作业的系统(也就是简单的日志解析),而不是用于网络搜索查询。

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。

对不起文字墙,很无聊。路易斯。

于 2009-11-03T06:59:25.970 回答
1

如果您在多台服务器上运行它们,则基于文件系统的方法不会削减它(除非您有一个一致的共享文件系统,这不太可能并且可能不可扩展)。

因此,无论如何您都需要一个基于服务器的数据库来允许在 Web 服务器之间共享数据。如果您非常重视性能或可用性,您的应用程序将支持多个 Web 服务器。

于 2009-09-17T21:33:05.733 回答
0

我会说 MySql DB 会是更好的选择,除非你有一些机制来处理平面文件上的锁(以及一些控制访问的方法)。在这种情况下,DB 层(不管特定的 DBMS)充当间接层,让您不必担心。

由于 OP 没有指定 Web 服务器(PHP 实际上可以从命令行运行),所以我不确定缓存技术是否就是他们所追求的。OP 可能正在寻求进行某种非网站驱动的飞行数据转换。谁知道。

于 2009-09-17T18:24:01.777 回答
0

如果您的系统有 PHP 缓存(将已编译的 PHP 代码缓存在内存中,如 APC),请尝试将您的数据作为 PHP 代码放入 PHP 文件中。如果必须写入数据,则存在一些安全问题。

于 2009-09-17T18:50:28.503 回答
0

我需要一种简单的方法让多个正在运行的 PHP 脚本共享数据。

APC和 memcached 都是不错的选择,具体取决于上下文。 共享内存也可能是一种选择。

我应该创建一个带有 RAM 存储引擎的 MySQL 数据库,并通过它共享数据(多个脚本可以同时连接到同一个数据库吗?)

这也是一个不错的选择,但可能不如 APC 或 memcached 快。

或者每行包含一个数据的平面文件会更好吗?

如果这是只读数据,这是有可能的——但可能比上述任何选项都慢。特别是如果数据很大。然而,与其编写自定义解析代码,不如考虑简单地构建一个 PHP 数组,然后 include() 文件。

如果这是一个可以被多个写入者同时访问的数据存储,那么千万不要使用平面文件!从多个进程写入平面文件可能会导致文件损坏。您可以锁定文件,但可能会出现锁定争用问题和较长的锁定等待时间。

处理并发写入是 mysql 和 memcached 等应用程序存在的原因。

于 2009-09-17T23:05:02.833 回答