3

PHP Shopify コネクタと組み合わせて Laravel 4 を使用しています。最初に必要になったときに特定の製品ページをキャッシュすることで、Shopify 製品を取得するための呼び出しを制限しようとしています。

このフローをテストするために、Laravel で次の簡単なルートを作成しました。

Route::get('product/{id}', function($id)
{
    $value = Cache::remember($id, 10, function() use ($id)
    {
        echo('Getting this from Shopify');
        $shopify = new ShopifyLib;
        return $shopify->getShopifyProduct($id);
    });

    var_dump($value);
});

ShopifyLib は、Shopify コネクタと通信するために私が作成した PHP ライブラリです。この呼び出しは、JSON 形式の製品ページを常に正しく返します。問題は、呼び出しが常に Shopify に対して外部で行われ、キャッシュから取得されないことです。

次のエントリを保存してデータベース キャッシュを使用しています。

key : laravel172989477
value : eyJpdiI6Imw4aUwzNHN4eExwdElPWFZKXC9hdFpVRjc4ZG5pK1dYMTlJVm44a1doKzlvPSIsInZhbHVlIjoieVJ6N2J6Q1A3SGNsWG1xWFJKTUdVak5FSEtHWDZKQkd2Y2x0ZEI2dHlvcz0iLCJtYWMiOiJhNWU0OGUxOTkyNWE2NTRhNTY1ZTNhMjRlOWNhNzRjNGI1ZDIyY2YzNGM3NTVjOThhMDUyYjllZmI1OTJiZmE1In0=
expiration : 1386616552

$id は決して変更されないため、このエントリは毎回返されるはずです。

以下を使用して、より簡単な例を試しました。

Route::get('product/{id}', function($id)
{
    $value = Cache::remember('test', 5, function()
    {
        echo('Not getting this from the cache!');
        return 'example';
    });

    var_dump($value);
});

これは、非キャッシュを 1 回呼び出すだけで、それ以降のすべての呼び出しがキャッシュに送られるという期待どおりに機能しました。

4

1 に答える 1

3

Shopify から返された応答は、最初に疑ったように、実際には JSON ではなかったことが判明しました。どうやらアレイだったようです。応答を JSON エンコードすることにより、キャッシュは期待どおりに機能しています。

Route::get('product/{id}', function($id)
{
    $value = Cache::remember("product_$id", 10, function() use ($id)
    {
        echo('Getting this from Shopify');
        $shopify = new ShopifyLib;
        return json_encode($shopify->getShopifyProduct($id));
    });

    var_dump(json_decode($value));
});
于 2013-12-10T16:57:18.153 に答える