我使用 PHP 创建了一个小型且非常简单的基于 REST 的 Web 服务。 该服务从不同的服务器获取数据并返回结果。它更像是代理而不是完整的服务。
Client --(REST call)--> PHP Webservice --(Relay call)--> Remote server
<-- Return data ---
为了保持尽可能低的成本,我想在 PHP Webservice 系统上实现一个缓存表,通过在服务器内存中维护数据一段时间,并且仅在超时后(假设在 30 年后)重新请求数据分钟)。
在伪代码中我基本上想这样做:
$id = $_GET["id"];
$result = null;
if (isInCache($id) && !cacheExpired($id, 30)){
$result = getFromCache($id);
}
else{
$result = getDataFromRemoteServer($id);
saveToCache($result);
}
printData($result);
上面的代码应该从由 id 标识的远程服务器获取数据。如果它在缓存中并且尚未过去 30 分钟,则应从缓存中读取数据并作为 Web 服务调用的结果返回。如果没有,则应查询远程服务器。
在思考如何做到这一点时,我意识到两个重要方面:
- 出于性能考虑,我不想使用文件系统 I/O 操作。 相反,我想将缓存保留在内存中。所以,没有 MySQL 或本地 文件操作。
- 我无法使用 session ,因为缓存的数据必须在全局不同的用户、浏览器和互联网连接之间共享。
因此,如果我能够以某种方式在多个 GET 请求之间共享内存中的对象,我认为我将能够非常轻松地实现这个缓存系统。
但是我该怎么做呢?
编辑:我忘了提及我无法在该 PHP 服务器上安装任何模块。这是一个纯粹的“仅虚拟主机”服务。
最佳答案
我不会在(PHP)应用程序级别实现缓存。 REST 是 HTTP,因此您应该在 Internet 和 Web 服务器之间使用缓存 HTTP 代理。只要应用程序不断增长(如果您担心成本),这两个服务器、Web 服务器和代理就可以位于同一台计算机上。
在应用程序或服务器级缓存方面,我发现两个基本问题:
使用memcached会导致需要将用户 session 绑定(bind)到memcache所在的物理服务器上的情况。这使得水平缩放变得更加复杂(并且昂贵)
软件应该分层开发。缓存不应该成为应用程序层(和/或业务逻辑)的一部分。它是使用专用组件的不同层。由于对此有众所周知的解决方案(HTTP 缓存代理),因此应该使用它们来支持自行设计的解决方案。
关于php - 如何在 PHP 中的多个 get 请求之间共享对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18687076/