有没有办法推迟PHP代码?
与javascript一样,我们使用<script defer="defer"></script>
。有没有办法用PHP代码做同样的事情?
更新 这是我使用的代码:
信息:此代码位于我的侧边栏中,导致网站在加载时停止2-3秒。我正试图跳过这个问题并在网站的其余部分加载时加载此代码....我也开放其他编码解决方案。
<div style="padding:5px;">
<?php
function currency($from_Currency,$to_Currency,$amount) {
$amount = urlencode($amount);
$from_Currency = urlencode($from_Currency);
$to_Currency = urlencode($to_Currency);
$url = "http://www.google.com/ig/calculator?hl=en&q=$amount$from_Currency=?$to_Currency";
$ch = curl_init();
$timeout = 0;
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_USERAGENT , "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$rawdata = curl_exec($ch);
curl_close($ch);
$data = explode('"', $rawdata);
$data = explode('"', $data['3']);
$var = $data['0'];
return round($var,1);
}
?>
<div style="padding:2px; border-bottom:1px solid #EFEFEF;">1 USD er <?php echo currency("USD","NOK",1); ?> NOK<br />
</div>
<div style="padding:2px; border-bottom:1px solid #EFEFEF;">1 EUR er <?php echo currency("EUR","NOK",1); ?> NOK<br />
</div>
<div style="padding:2px; border-bottom:1px solid #EFEFEF;">1 GBP er <?php echo currency("GBP","NOK",1); ?> NOK<br />
</div>
<div style="padding:2px; border-bottom:1px solid #EFEFEF;">1 SEK er <?php echo currency("SEK","NOK",1); ?> NOK<br />
</div>
<div style="padding:2px; border-bottom:1px solid #EFEFEF;">1 DKK er <?php echo currency("DKK","NOK",1); ?> NOK<br />
</div>
</div>
答案 0 :(得分:4)
只有通过__destruct
方法推迟PHP代码(没有黑客攻击)的可维护方式:
class App {
protected $deferredStack = [];
public function __destruct() {
$this->runDeferredStack();
}
public function defer(callable $deferred){
$this->deferredStack[] = $deferred;
}
protected function runDeferredStack()
{
array_map('call_user_func', array_reverse($this->deferredStack))
}
}
用法:
$app->defer(function(){ echo "bye"; })
// code that opens a resource here...
$app->defer(function(){ echo "closing resource"; })
// code that opens DB connection here...
$app->defer(function(){ echo "closing DB connection"; })
$app->defer(function(){ echo "hi"; })
由于延迟堆栈以相反的顺序执行,stdout
将是:
hi
closing DB connection
closing resource
bye
答案 1 :(得分:1)
看起来你想要AJAX。简单地说:
如果你使用jQuery,方便函数load
是一个很好的起点。
答案 2 :(得分:1)
两个选项:
无论哪种方式都可以,但如果数据量很大和/或远程连接可能很慢,那么cron选项可能更合适。
答案 3 :(得分:0)
就像已经在这里建议的那样,使用Ajax以异步方式加载内容。但这是一个如何运作的例子。
有几种方法可以做到这一点,但最好的办法是使用JS库。一个非常普遍的人是jQuery(也许你已经在使用它了?)。
您可以使用jQuery轻松地进行Ajax调用:
$.ajax({
url: 'http://127.0.0.1/controller/someAction/param1',
success: function(data) {
$('.result').html(data);
alert('Load was performed.');
}
});
在此示例中,我正在调用此网址:http://127.0.0.1/controller/action/param1
。当然,您可以使用任何所需的URL。但这里的要点是你必须确保它只返回你想看到的东西。所以它不应该返回整个页面(DOCTYPE和所有),而是像:
// This is obviously just fictional, i have no idea how your php code looks like
public function someAction($param1)
{
$menu = $this->getPartialView('menu.phtml');
$this->view->parse($menu);
}
menu.phtml看起来像这样:
<div>
<div> ... content ... </div>
</div>
现在回到JS代码。如果一切顺利,那么应该触发success
方法。所有内容都将在变量data
中。所以你现在需要做的就是将数据放在正确的DIV中。这就是这条线的用途:$('.result').html(data);
。这会将加载的内容放在类名为result
的div中。
这基本上就是你需要做的一切。
答案 4 :(得分:-1)
您可能想尝试将这些div移动到页脚,而不是使用JavaScript将它们移动到位。虽然,如果用户没有JS,它会阻止优雅的降级,因为它会保留在页脚中。另一方面,它将使您免于通过AJAX提出额外请求。
如果使用jQuery,它将是这样的:
<div class="footer_calcs">
<div style="padding:2px; border-bottom:1px solid #EFEFEF;">1 USD er <?php echo currency("USD","NOK",1); ?> NOK<br />
</div>
...
</div>
<script ...>
$(function(){
$('.footer_calcs').children().appendTo( $('#id_of_destination_in_sidebar') ):
});
</script>
另一个选项可能是:
$from_currency
的值“1”转换为$to_currency
$currency_ratio
$currency_ratio
比率,因此您无需为每个计算制作一个CURL请求。这样你只能进行一次CURL调用而不是5次调用,这样可以显着加快速度。