Laravel帮助页面加载缓慢

时间:2018-01-21 10:16:36

标签: php laravel curl

我有一个帮助类,并且有函数:

  static public function getPRBcurr(){
    $currency = Cache::get('currency_prb_ee_agroTimeout');
    if($currency) return $currency;

    $contentCurrency = self::file_get_contents_curl(
        'https://www.agroprombank.com/xmlinformer.php'
    );

    if(!$contentCurrency) {
        $_currency = Storage::get('currency_prb_agro');
        Cache::put('currency_prb_agroTimeout', $_currency, 60);
        return $_currency;
    }

    $xmls = simplexml_load_string( $contentCurrency );

    $currency = (string)$xmls->course[1]->currency[5]->currencySell;
    $currency = ($currency > 0) ? $currency : null;
    $currency = (strpos($currency, '1.0') !== false) ? '0.99' : $currency;

    Cache::put('currency_prb_agroTimeout', $currency, 720);
    Storage::put('currency_prb_agro', $currency);
    return $currency;
}

static function file_get_contents_curl($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 500);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}

我有一个product.blade:

<div class="price-prb">
            <span itemprop="price">
                @php
                    $prb = intval($product->price * Helper::getPRBcurr());
                @endphp
                {{ $prb }}
                <span itemprop="priceCurrency" content="PRB"> {!! trans_choice('messages.currency.RUB', $prb) !!}</span>
            </span>
        </div>

当我去分类时,所有产品(890产品),页面加载速度慢。如果我删除Helper::getPRBcurr()一切都很好。我该如何解决这个问题?函数file_get_contents_curl 500ms timeout中的问题。

2 个答案:

答案 0 :(得分:0)

直接使用视图文件调用Helper::getPRBcurr()是一个坏主意。该函数必须在具有渲染的页面之前完全完成,因此加载缓慢。将其移至异步调用将快速呈现页面,然后等待数据获取,这是一种更好的用户体验。

答案 1 :(得分:0)

我相信这个方法调用的原因总是很慢,因为你的缓存不起作用。您正在阅读的缓存键与您正在存储的缓存键不同,因此实际上您每次都会运行HTTP请求。

$currency = Cache::get('currency_prb_ee_agroTimeout');

设置缓存时:

Cache::put('currency_prb_agroTimeout', $currency, 720);

请注意,密钥不同,currency_prb_ee_agroTimeoutcurrency_prb_agroTimeout

但是,正如@btl在提供请求时运行HTTP请求所给出的答案中所提到的那样,会导致糟糕的用户体验,您应该使用AJAX来加载结果。通过修复缓存问题和实现它,一切都会更快地运行。