有没有办法推迟PHP代码?
有没有办法推迟PHP代码 就像在javascript中一样,我们使用有没有办法推迟PHP代码?,php,deferred,Php,Deferred,有没有办法推迟PHP代码 就像在javascript中一样,我们使用。有没有任何方法可以对PHP代码执行相同的操作 更新: 以下是我使用的代码: 信息:此代码位于我的侧边栏中,加载时会导致网站停止2-3秒。我正在尝试跳过此过程,并在站点的其余部分已加载时加载此代码。。。。我也对其他编码解决方案持开放态度 <div style="padding:5px;"> <?php function currency($from_Currency,$to_Currency,$amount)
。有没有任何方法可以对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>
看起来你想要AJAX。简而言之:
不要在页面中包含有问题的代码;将一些占位符(如加载动画)放在代码结果显示的位置
取而代之的是JavaScript代码,它向服务器发出AJAX请求;服务器通过运行有问题的代码并返回一些结果(可能是纯HTML)来处理该请求
JavaScript代码接受这个结果并将其合并到页面中,替换占位符
如果使用jQuery,方便功能是一个很好的起点。两个选项:
使用AJAX在一个单独的请求中加载该页面,这样就不会延迟页面加载。但是,由于这是一个不同的域,您将不得不破解相同的源策略,例如使用,因此这可能会很棘手,如果做得不好,会带来安全隐患。请尝试使用jQuery,如所示
运行cron作业,定期在服务器上检索此数据,并将其存储在数据库中,以便从那里加载李>
任何一种方法都可以,但如果数据量大和/或远程连接速度慢,则cron选项可能更可取。您可能希望尝试将这些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>
$.ajax({
url: 'http://127.0.0.1/controller/someAction/param1',
success: function(data) {
$('.result').html(data);
alert('Load was performed.');
}
});
<div>
<div> ... content ... </div>
</div>
1美元挪威克朗
...
$(函数(){
$('.footer_calcs').children().appendTo($('.footer#id_of_destination_in_sidebar')):
});
另一个选项可能是:
将$的值“1”从_货币
转换为$到_货币
将该比率存储在PHP变量$currency\u ratio
使用$currency\u ratio
ratio进行所有计算,这样您就不需要为每一个计算向google发出CURL请求
这样,您只需执行一次CURL调用,而不是5次,这将大大加快速度。就像这里已经建议的那样,使用Ajax以异步方式加载内容。但这里有一个关于它如何工作的例子
有几种方法可以做到这一点,但最好的选择是使用JS库。一个非常流行的是jQuery(也许你已经在使用它了?)
使用jQuery可以很容易地进行Ajax调用,如下所示:
<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>
$.ajax({
url: 'http://127.0.0.1/controller/someAction/param1',
success: function(data) {
$('.result').html(data);
alert('Load was performed.');
}
});
<div>
<div> ... content ... </div>
</div>
在本例中,我正在调用此URL:http://127.0.0.1/controller/action/param1
。当然,你可以使用任何你想要的URL。但这里的要点是,你必须确保它只返回你想看到的内容。因此,它不应该返回整个页面(DOCTYPE和all),而应该返回如下内容:
// 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 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>
$.ajax({
url: 'http://127.0.0.1/controller/someAction/param1',
success: function(data) {
$('.result').html(data);
alert('Load was performed.');
}
});
<div>
<div> ... content ... </div>
</div>
... 内容。。。
现在回到JS代码。如果一切顺利,那么应该触发success
方法。所有内容都将在变量数据中
。因此,您现在需要做的就是将数据放在正确的DIV中。这就是此行的目的:$('.result').html(数据)代码>。这将把加载的内容放在一个具有类名result
的div中
这基本上就是您需要做的所有事情。延迟PHP代码的唯一可维护方法(没有黑客攻击)是通过\uu destruct方法:
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
您还可以使用什么是“相同的”?因为它不能完全相同,因为PHP没有文档、DOM就绪等概念。您能举个例子吗?当你试图提出一个问题时,你可能会回答自己的问题。这毫无意义<代码>
表示可以在脚本加载时继续加载其他页面元素。另一方面,PHP是在服务器上执行的,通常是在任何东西到达浏览器之前。请再次检查defer的功能,并告诉我们您试图用PHP实现什么:然后通过ajax请求将侧栏加载到专用于该任务的不同PHP脚本。很抱歉,我在这里有点不知所措。。。你有这方面的代码吗?如果可以的话,我会使用JS,但我有点笨,所以你有我可以看/使用的代码吗?带示例的教程:这完全不是这里的问题。@Jon是的!若页面加载在页脚中停止了几秒钟,那个就可以了,因为用户并没有注意到这一点。依我看,这是一个比AJAX更好的选择。