2

我用 PHP 创建了一个小型且非常简单的基于 REST 的 Web 服务。该服务从不同的服务器获取数据并返回结果。它更像是一个代理而不是一个完整的服务。

Client --(REST call)--> PHP Webservice --(Relay call)--> Remote server
                        <-- Return data ---

为了尽可能降低成本,我想通过在服务器内存中维护一段时间的数据来在 PHP Web 服务系统上实现一个缓存表,并且只在超时后重新请求数据(比如说 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. 我不能使用会话,因为缓存的数据必须在全球不同的用户、浏览器和互联网连接之间共享。

所以,如果我能以某种方式在多个 GET 请求之间共享内存中的对象,我认为我将能够很容易地实现这个缓存系统。

但我怎么能这样做呢?


编辑:我忘了提到我不能在那个 PHP 服务器上安装任何模块。这是一个纯粹的“仅网络托管”服务。

4

2 回答 2

2

我不会在(PHP)应用程序级别上实现缓存。REST 是 HTTP,因此您应该在 Internet 和 Web 服务器之间使用缓存 HTTP 代理。只要应用程序增长(如果您担心成本),服务器、Web 服务器和代理都可以位于同一台机器上。

当涉及到应用程序或服务器级缓存时,我发现了两个基本问题:

  • 使用 memcached 会导致需要将用户会话绑定到存在 memcache 的物理服务器的情况。这使得水平缩放更加复杂(并且昂贵)

  • 软件应该分层开发。缓存不应该是应用层(和/或业务逻辑)的一部分。它是使用专用组件的不同层。由于对此有众所周知的解决方案(HTTP 缓存代理),因此应该使用它们来支持自制解决方案。

于 2013-09-08T18:24:51.683 回答
0

好吧,如果您确实必须使用 PHP,并且您无法修改服务器,并且出于性能原因确实需要内存缓存(没有首先测量任何其他解决方案具有足够好的性能),那么您的解决方案必须是更改虚拟主机。

否则,你将无法做到。PHP 实际上并没有任何可用的内存共享工具。通常的方法是使用 Memcached 或 Redis 或其他单独运行的东西。

对于初学者和概念验证,我真的会使用基于文件的缓存。访问文件而不是请求远程资源要快得多。事实上,您可能不会注意到文件缓存和内存缓存之间的区别。

于 2013-09-08T18:29:39.743 回答