有没有办法推迟PHP代码?

有没有办法推迟PHP代码?,php,deferred,Php,Deferred,有没有办法推迟PHP代码 就像在javascript中一样,我们使用。有没有任何方法可以对PHP代码执行相同的操作 更新: 以下是我使用的代码: 信息:此代码位于我的侧边栏中,加载时会导致网站停止2-3秒。我正在尝试跳过此过程,并在站点的其余部分已加载时加载此代码。。。。我也对其他编码解决方案持开放态度 <div style="padding:5px;"> <?php function currency($from_Currency,$to_Currency,$amount)

有没有办法推迟PHP代码

就像在javascript中一样,我们使用
。有没有任何方法可以对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更好的选择。