有没有办法推迟PHP代码?

Dem*_*lio 5 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>
Run Code Online (Sandbox Code Playgroud)

mar*_*cio 6

延迟 PHP 代码的唯一可维护的方法(无需 hack)是 trough__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))
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

$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"; })
Run Code Online (Sandbox Code Playgroud)

由于延迟堆栈以相反的顺序执行stdout,因此:

hi
closing DB connection
closing resource
bye
Run Code Online (Sandbox Code Playgroud)

您还可以使用register_shutdown_function


Mat*_*son 1

两种选择:

  1. 使用 AJAX 在单独的请求中加载它,这样就不会延迟页面加载。然而,由于这是一个不同的域,您将不得不破解相同的源策略,例如使用JSONP,因此这可能很棘手,并且如果做得不好会产生安全隐患。按照本教程尝试使用 jQuery 。
  2. 运行一个 cron 作业,定期在服务器上检索此数据并将其存储在数据库中,以便可以从那里加载。

无论哪种方式都可以,但如果数据量很大和/或远程连接可能很慢,那么 cron 选项可能更可取。