php - 如何在 PHP 中的多个 get 请求之间共享对象?

标签 php web-services rest caching

我使用 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 服务调用的结果返回。如果没有,则应查询远程服务器。

在思考如何做到这一点时,我意识到两个重要方面:

  1. 出于性能考虑,我不想使用文件系统 I/O 操作。 相反,我想将缓存保留在内存中。所以,没有 MySQL 或本地 文件操作。
  2. 我无法使用 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/

相关文章:

php - 从 PHPUnit 测试访问数据库

c# - 以编程方式创建的 Web 服务在客户端服务调用时失败

algorithm - 根据给定主题查找相关词

java - 将curl http请求转换为Java的错误请求

php - symfony2 Doctrine - 将 child 添加到 self 相关的实体

php - Google map v3 api 不支持越南语和泰语/字符?

php - 准备查询与构造查询

c# - 如何将 WCF 客户端代理生成的类中的方法标记为虚拟

java - 如果处理请求体时发生异常,则不使用 Jersey 自定义 ExceptionMapper

php - 从PHP中的变量中删除重复的字符串