对于 Web 应用程序(图像数据库),我使用的是 Restful 服务器模块。数据由另一个 Web 应用程序(商店)请求。XML 的生成最多需要 1 秒。商店必须等待 API 响应才能显示例如产品页面。是否可以为 Restful Server API 激活一些缓存?
我已经尝试过使用静态发布器,但它似乎只适用于 cms 页面。非常感谢,弗洛里安
对于 Web 应用程序(图像数据库),我使用的是 Restful 服务器模块。数据由另一个 Web 应用程序(商店)请求。XML 的生成最多需要 1 秒。商店必须等待 API 响应才能显示例如产品页面。是否可以为 Restful Server API 激活一些缓存?
我已经尝试过使用静态发布器,但它似乎只适用于 cms 页面。非常感谢,弗洛里安
RestfulService为你做缓存。它接受 2 个参数。一个 serviceURL 和一个缓存时间。默认值为 3600(1 小时)。这只有在商店是用银条建造时才有效。
$serviceURL = 'http://www.imagedatabase.com/api/v1/Product?ID=1';
$service = new RestfulService($serviceURL, 7200); //2 hours expiry
$xml = $service->request()->getBody();
//get fields values
$productName = $service->searchValue($xml, 'Name');
$productPrice = $service->searchValue($xml, 'Price');
假设 Product 是一个数据对象,您还需要对 Product 进行修改。
class Product extends DataObject {
...
static $api_access = true;
...
function canView($member = null) {
return true;
}
}
RestfulService 文档 http://doc.silverstripe.org/framework/en/reference/restfulservice
好吧,我个人会缓存在客户端上(所以在商店里)
但如果你必须这样做,我认为没有任何内置的方法。你可以继承restful服务器并自己做一些基本的缓存(就像默认的SS RestfulClient一样,将它保存到一个文件中)
class MyServer extends RestfulServer {
public $cache_expire;
function __construct($cache_expire = 3600) {
$this->cache_expire = $cache_expire;
}
protected function getHandler($className, $id, $relationName) {
$cache_path = Director::getAbsFile("assets/rest-cache/$className-$id-$relationName.{$this->request->getExtension()}");
if ($this->cache_expire > 0 && !isset($_GET['flush'])
&& @file_exists($cache_path) && @filemtime($cache_path) + $this->cache_expire > time()
) {
$store = file_get_contents($cache_path);
$response = unserialize($store);
} else {
$response = parent::getHandler($className, $id, $relationName);
$store = serialize($response);
file_put_contents($cache_path, $store);
}
return $response;
}
}
// 注意,我从未测试过这段代码,所以你可能会遇到一些小的拼写错误或类似的问题