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

如何在PHP中的多个get请求之间共享对象?,php,web-services,rest,caching,Php,Web Services,Rest,Caching,我用PHP创建了一个小而简单的基于REST的Web服务。 此服务从其他服务器获取数据并返回结果。它更像是一个代理,而不是一个完整的服务 Client --(REST call)--> PHP Webservice --(Relay call)--> Remote server <-- Return data --- 上面的代码应该从由id标识的远程服务器获取数据。如果数据在缓存中,并且30分钟尚未过去,则应从缓存读取数据,并作为

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

Client --(REST call)--> PHP Webservice --(Relay call)--> Remote server
                        <-- Return data ---
上面的代码应该从由id标识的远程服务器获取数据。如果数据在缓存中,并且30分钟尚未过去,则应从缓存读取数据,并作为webservice调用的结果返回。如果不是,则应查询远程服务器

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

  • 出于性能考虑,我不想使用文件系统I/O操作。 相反,我希望将缓存保留在内存中。因此,没有MySQL或本地 文件操作
  • 我不能使用会话,因为缓存的数据必须在全球不同的用户、浏览器和internet连接之间共享
  • 所以,如果我可以在多个GET请求之间共享内存中的对象,我想我可以很容易地实现这个缓存系统

    但我怎么能做到呢



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

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

    在应用程序或服务器级缓存方面,我看到了两个基本问题:

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

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


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

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


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

    对于redis、memcached和内存存储中的其他键值engines@dev-我忘了提到我不能在PHP服务器上安装任何模块。这是一个纯粹的“仅限webhosting”服务。您可以简单地指定一个http缓存头并在应用程序前面放置一个缓存http代理吗?@Timo如果您有文件系统I/O性能问题,您应该从重新定义应用程序环境开始。使用典型的webhosting设置无法实现繁重而高效的缓存。这一点很好。在Web服务和客户端之间放置专用缓存/代理可能是最好的方法。
    $id = $_GET["id"];
    $result = null;
    
    if (isInCache($id) && !cacheExpired($id, 30)){
        $result = getFromCache($id);
    }
    else{
        $result = getDataFromRemoteServer($id);
        saveToCache($result);
    }
    
    printData($result);