推迟PHP代码有什么办法吗?

时间:2012-09-03 10:20:44

标签: php deferred

有没有办法推迟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>

5 个答案:

答案 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

您也可以使用register_shutdown_function

答案 1 :(得分:1)

看起来你想要AJAX。简单地说:

  1. 不要在页面中包含违规代码;将一些占位符(如加载动画)放在代码结果出现的位置。
  2. 取而代之的是包含将AJAX请求发回服务器的JavaScript代码;服务器通过运行有问题的代码并返回一些结果(可能是直接的HTML)来处理此请求。
  3. JavaScript代码获取此结果并将其合并到您的页面中,替换占位符。
  4. 如果你使用jQuery,方便函数load是一个很好的起点。

答案 2 :(得分:1)

两个选项:

  1. 使用AJAX在单独的请求中加载它,以便它不会延迟页面加载。但是,由于这是一个不同的域名,您将不得不破解相同的原始政策,例如使用JSONP,这可能会很棘手,如果做得不好就会产生安全隐患。根据{{​​3}}尝试使用jQuery。
  2. 运行一个cron作业,在服务器上定期检索此数据并将其存储在数据库中,以便从那里加载。
  3. 无论哪种方式都可以,但如果数据量很大和/或远程连接可能很慢,那么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>

另一个选项可能是:

  1. $from_currency的值“1”转换为$to_currency
  2. 将该比率存储在PHP var $currency_ratio
  3. 对所有计算使用$currency_ratio比率,因此您无需为每个计算制作一个CURL请求。
  4. 这样你只能进行一次CURL调用而不是5次调用,这样可以显着加快速度。