Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 以前缓存的响应的部分更新_Php_Rest_Caching_Cache Control - Fatal编程技术网

Php 以前缓存的响应的部分更新

Php 以前缓存的响应的部分更新,php,rest,caching,cache-control,Php,Rest,Caching,Cache Control,我正在从头开始用php构建一个RESTAPI,并使其正常工作,现在,我想处理与头相关的缓存,这样客户就不必一次又一次地请求他们已经拥有的资源 rest服务中的每个实体都链接到一个数据库表,我使用的方法是在每个表上创建/更新一个字段,因此我可以在每个资源请求上提供一个“上次修改”的头 只是为了明确我如何处理请求,这是生成响应的代码段,我计划在其中添加“Last modified”头 更清楚地说,对于以下请求/api/products/1,$resourceType将按产品显示,而$resource

我正在从头开始用php构建一个RESTAPI,并使其正常工作,现在,我想处理与头相关的缓存,这样客户就不必一次又一次地请求他们已经拥有的资源

rest服务中的每个实体都链接到一个数据库表,我使用的方法是在每个表上创建/更新一个字段,因此我可以在每个资源请求上提供一个“上次修改”的头

只是为了明确我如何处理请求,这是生成响应的代码段,我计划在其中添加“Last modified”头

更清楚地说,对于以下请求/api/products/1,$resourceType将按产品显示,而$resourceId将为1

现在,对于缓存,如果存在$resourceId,我将简单地添加一个带有最后更新时间戳的“Last modified”头

如果没有$resourceId,我将查询集合中最高更新的时间戳,并将其作为最后修改的头

最后一点就是我的问题所在。假设我的数据库中有20000个产品,并且更新了单个产品的价格;这意味着更新后对api/products的请求将不得不再次获取20000项,尽管只修改了1字节的数据,我想知道是否有办法告诉浏览器只获取一条记录并更新其缓存

这是我从零开始的第一个REST服务,因此,欢迎对我发布的代码提供任何建议


谢谢。

您可以实现服务器端缓存。它更容易管理。您可以创建一个php数据库表,并将api响应存储在该表中。您还可以使用memcache服务器来缓存api的响应

我想知道是否有办法告诉浏览器应该只获取一条记录并更新其缓存

不,当您为一个资源提供所有记录时不会

浏览器缓存很乐意为单独的产品管理单独的到期时间,但是没有通用的机制将差异发送回浏览器

已经提出了解决方案(例如),因为在轮询Atom提要时基本上会出现相同的问题,但它们需要了解这些技术的客户机


要么减少你的主要资源的规模,要么接受它将在每次变更中提供。

对不起,我不认为这对我提出的问题有什么帮助。缓存功能已经完成,并且运行良好,而且我可以轻松识别那些已更新的记录,但我无法在客户端缓存中进行部分更新,甚至不知道是否可能。感谢您的回答,我必须考虑另一种方法,因为一个页面可以包含1000万条信息,而且不能接受每次请求都有新的负载;也许通过页面获取可以使这一点变得轻松一点?是的;按页拆分,这样只有一些资源无效,这是允许更多缓存重用的好方法。
switch( strtolower($requestMethod) ){
...
case "get":{
    if ($resourceId){
        $this->resource = $resourceType::byId($resourceId);
        if ( !$this->resource ){
            $this->responseCode = 404;
        }
        else{
            $this->responseBody = json_encode($this->resource); 
            $this->responseCode = 200;
            $this->responseHeaders["Content-Type"] = "application/json; charset=UTF-8";
        }   
    }
    else{
        $this->responseBody = json_encode($resourceType::find($this->requestData));
        $this->responseCode = 200;
        $this->responseHeaders["Content-Type"] = "application/json; charset=UTF-8";
    }
}
break;
...
}