我使用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分钟,则应该从缓存中读取数据并作为webservice调用的结果返回。如果没有,则应查询远程服务器。
在思考如何做到这一点时,我意识到了两个重要方面:
所以,如果我可以以某种方式在多个GET请求之间共享内存中的对象,我可以很容易地实现这个缓存系统。
但我怎么能这样做?
编辑:我忘了提到我无法在该PHP服务器上安装任何模块。这是一个纯粹的“仅限虚拟主机”服务。
答案 0 :(得分:2)
我不会在(PHP)应用程序级别上实现缓存。 REST是HTTP,因此您应该在Internet和Web服务器之间使用缓存HTTP代理。只要应用程序增长(如果您担心成本),服务器,Web服务器和代理服务器都可以位于同一台计算机上。
在应用程序或服务器级缓存方面,我发现了两个基本问题:
使用memcached会导致需要将用户会话绑定到存在memcache的物理服务器。这使得水平缩放变得更加复杂(而且价格昂贵)
软件应该分层开发。缓存不应该是应用程序层(和/或业务逻辑)的一部分。它是使用专用组件的不同层。由于有众所周知的解决方案(HTTP缓存代理),因此应该使用它们来支持自制解决方案。
答案 1 :(得分:0)
好吧,如果你必须使用PHP,并且你无法修改服务器,并且出于性能原因需要内存中缓存(没有先测量任何其他解决方案具有足够好的性能),那么适合您的解决方案必须要改变网站主办。
否则,你将无法做到。 PHP实际上没有任何可用的内存共享功能。通常的方法是使用Memcached或Redis或其他单独运行的东西。
对于启动器和概念验证,我真的会使用基于文件的缓存。访问文件而不是请求远程资源是更快的方式。实际上,您可能没有注意到文件缓存和内存缓存之间的区别。