5

我用 PHP 构建了一个小型 Web 服务。我想控制对特定 API 方法的调用次数。

起初我想使用文本文件,因为它只是一个整数。但是在仔细查看 SQLite 之后,它似乎更方便了。所以代码就是:从 SQLite 获取“计数器”并在调用该方法时将其递增,然后将其存储回 SQLite db。

这是正确的做法吗?只使用一个文件或者......也许其他东西会更简单,更具可扩展性吗?

提前致谢。

4

6 回答 6

5

第三种可能性:memcachedb。它与memcached兼容,但将它的键值存储存储到 BDB 文件中。它不仅具有读写命令,还具有数值的原子增量/减量。

另一种选择是编写一个“柜台服务器”。通过套接字获取“读取”和“增量”命令的独立进程。优点是做“原子”增量真的很容易。它将它的计数器存储在一个简单的文件中,没有并发问题,因为从不超过一台服务器。

用不到 100 行的 C 语言编写应该很容易。只需一个紧密循环,一次处理一个命令,每隔几秒刷新一次磁盘。由于处理非常简单,因此延迟很小。

于 2009-01-25T03:02:14.473 回答
3

数据库通常会比文件系统更好地扩展,但您需要小心并使用适当的锁与任何一种机制。

于 2009-01-25T00:16:21.813 回答
2

当然使用平面文件。

  • 这将是正确的做法
  • 极其简单
  • 不依赖第三方库
  • 您将能够仅使用普通记事本查看或更新计数器。
  • 比 SQLite 更快(没有 SQL 解析,没有其他开销)
  • 和 SQLite 一样可扩展(SQLite 只是更复杂的平面文件)

如果您需要尽可能快的东西,则必须在内存中创建持久进程以消除 I/O 瓶颈。但是请...不要使用 SQL 数据库来存储单个整数。

于 2009-01-25T00:19:35.457 回答
1

将它放在一个文本文件和 SQLite DB 的真实数据库中,如果文件当前处于打开状态并且发生新的打开它的请求,则第二个请求将出错。使用真正的数据库,如 MySQL、MSSQL 或任何可用的数据库。

于 2009-01-25T00:57:11.873 回答
1

您可以使用共享内存来保存计数器,并使用锁定来确保安全增量。

于 2009-01-25T03:27:49.180 回答
0

根据 SQLite,它可以处理高达“100K [原文如此] 点击/天”的网站。如果您要解决这个问题,您可能需要研究一个更强大的数据库,例如 MySQL。但是,如果您每天为一个网站向数据库写入 10 万条记录,根据您的示例,我认为您正在做的事情有问题。这听起来确实像是一项缓存工作。我对PHP一无所知,对不起。

They have this to say about files vs. SQLite: "Many programs use fopen(), fread(), and fwrite() to create and manage files of data in home-grown formats. SQLite works particularly well as a replacement for these ad hoc data files." (source)

于 2009-01-26T21:20:32.797 回答