2013-07-01 160 views
0

用於Web應用程序(圖像數據庫)我正在使用Restful服務器模塊。該數據是由另一個Web應用程序(一家商店)請求的。 XML的生成需要1秒鐘。商店必須等待API回答以顯示例如產品頁面。是否有可能爲Restful Server API激活一些緩存?Silverstripe - Restful服務器緩存

我已經嘗試過Static Publisher,但它似乎只適用於cms頁面。 非常感謝, 弗洛裏安

+0

我還沒有聽說過一個解決方案的......但根據什麼正在採取這麼多時間,AJAX的查詢可以被緩存客戶端或者如果它是服務器本身,也許可以將XML結果作爲文件保存在服務器上,並將查詢的哈希值作爲名稱進行保存? – colymba

回答

1

好,我個人會緩存客戶端(因此在店)

上,但如果你有,我不認爲有任何內置該方式。 你可以繼承的寧靜服務器,並做一些基本的緩存自己(只是方式默認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; 
    } 
} 

//注意,我從來沒有測試此代碼,所以你可能會遇到輕微的拼寫錯誤或類似的東西

2

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'); 

您還需要進行修改,以產品假設產品是一個數據對象。

class Product extends DataObject { 
    ... 
    static $api_access = true; 
    ... 
    function canView($member = null) { 
     return true; 
    } 

} 

RestfulService文檔 http://doc.silverstripe.org/framework/en/reference/restfulservice