我有一个帮助类,并且有函数:
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
中的问题。
答案 0 :(得分:0)
直接使用视图文件调用Helper::getPRBcurr()
是一个坏主意。该函数必须在具有渲染的页面之前完全完成,因此加载缓慢。将其移至异步调用将快速呈现页面,然后等待数据获取,这是一种更好的用户体验。
答案 1 :(得分:0)
我相信这个方法调用的原因总是很慢,因为你的缓存不起作用。您正在阅读的缓存键与您正在存储的缓存键不同,因此实际上您每次都会运行HTTP请求。
$currency = Cache::get('currency_prb_ee_agroTimeout');
设置缓存时:
Cache::put('currency_prb_agroTimeout', $currency, 720);
请注意,密钥不同,currency_prb_ee_agroTimeout
与currency_prb_agroTimeout
。
但是,正如@btl在提供请求时运行HTTP请求所给出的答案中所提到的那样,会导致糟糕的用户体验,您应该使用AJAX来加载结果。通过修复缓存问题和实现它,一切都会更快地运行。