我用 PHP 构建了一个小型 Web 服务。我想控制对特定 API 方法的调用次数。
起初我想使用文本文件,因为它只是一个整数。但是在仔细查看 SQLite 之后,它似乎更方便了。所以代码就是:从 SQLite 获取“计数器”并在调用该方法时将其递增,然后将其存储回 SQLite db。
这是正确的做法吗?只使用一个文件或者......也许其他东西会更简单,更具可扩展性吗?
提前致谢。
我用 PHP 构建了一个小型 Web 服务。我想控制对特定 API 方法的调用次数。
起初我想使用文本文件,因为它只是一个整数。但是在仔细查看 SQLite 之后,它似乎更方便了。所以代码就是:从 SQLite 获取“计数器”并在调用该方法时将其递增,然后将其存储回 SQLite db。
这是正确的做法吗?只使用一个文件或者......也许其他东西会更简单,更具可扩展性吗?
提前致谢。
第三种可能性:memcachedb。它与memcached兼容,但将它的键值存储存储到 BDB 文件中。它不仅具有读写命令,还具有数值的原子增量/减量。
另一种选择是编写一个“柜台服务器”。通过套接字获取“读取”和“增量”命令的独立进程。优点是做“原子”增量真的很容易。它将它的计数器存储在一个简单的文件中,没有并发问题,因为从不超过一台服务器。
用不到 100 行的 C 语言编写应该很容易。只需一个紧密循环,一次处理一个命令,每隔几秒刷新一次磁盘。由于处理非常简单,因此延迟很小。
数据库通常会比文件系统更好地扩展,但您需要小心并使用适当的锁与任何一种机制。
当然使用平面文件。
如果您需要尽可能快的东西,则必须在内存中创建持久进程以消除 I/O 瓶颈。但是请...不要使用 SQL 数据库来存储单个整数。
将它放在一个文本文件和 SQLite DB 的真实数据库中,如果文件当前处于打开状态并且发生新的打开它的请求,则第二个请求将出错。使用真正的数据库,如 MySQL、MSSQL 或任何可用的数据库。
根据 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)