5

有什么办法可以推迟 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>
4

5 回答 5

4

延迟 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))
    }
}

用法:

$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

于 2014-12-30T18:37:33.450 回答
1

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

  1. 不要在您的页面中包含有问题的代码;在代码结果出现的地方放置一些占位符(如加载动画)。
  2. 取而代之的是 JavaScript 代码,它会向您的服务器发出 AJAX 请求;服务器通过运行有问题的代码并返回一些结果(可能是直接的 HTML)来处理这个请求。
  3. JavaScript 代码获取此结果并将其合并到您的页面中,替换占位符。

如果您使用 jQuery,那么便利功能load是一个不错的起点。

于 2012-09-03T10:48:12.763 回答
1

两种选择:

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

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

于 2012-09-03T10:51:35.137 回答
0

您可能想尝试将这些 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. 将值“1”转换$from_currency$to_currency
  2. 将该比率存储在 PHP var 中$currency_ratio
  3. 使用$currency_ratio比率进行所有计算,因此您无需为每个计算向谷歌发出 CURL 请求。

这样你只做一个 CURL 调用而不是 5 个,这应该会显着加快速度。

于 2012-09-03T10:52:20.350 回答
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.');
  }
});

在此示例中,我正在调用此 URL 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);. 这会将加载的内容放置在具有类名的 div 中result

这基本上就是您需要做的所有事情。

于 2012-09-03T11:08:11.357 回答