5

PHPコードを延期する方法はありますか?

JavaScript のように、 を使用します<script defer="defer"></script>。PHPコードで同じことをする方法はありますか?

更新: これが私が使用するコードです:

情報: このコードはサイドバーにあり、読み込み時に Web サイトが 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 コードを (ハックせずに) 延期するための保守可能な唯一の方法は、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

2つのオプション:

  1. AJAXを使用してこれを別のリクエストにロードし、ページのロードを遅らせないようにします。ただし、これは別のドメインであるため、 JSONPを使用するなど、同一生成元ポリシーをハックする必要があります。これは注意が必要な場合があり、不適切に実行するとセキュリティに影響します。このチュートリアルのように、jQueryを使用してみてください。
  2. このデータをサーバー上で定期的に取得し、データベースに保存してそこからロードできるようにするcronジョブを実行します。

どちらの方法でも問題ありませんが、データ量が多い場合やリモート接続が遅い場合は、cronオプションをお勧めします。

于 2012-09-03T10:51:35.137 に答える
1

AJAX が必要なようです。簡単に言えば:

  1. 問題のあるコードをページに含めないでください。コードの結果が表示されるプレースホルダー (ローディング アニメーションなど) を配置します。
  2. その代わりに、AJAX 要求をサーバーに返す JavaScript コードを含めます。サーバーは、問題のあるコードを実行し、何らかの結果 (おそらくストレート HTML) を返すことによって、この要求を処理します。
  3. JavaScript コードはこの結果を受け取り、それをページに組み込み、プレースホルダーを置き換えます。

jQuery を使用する場合は、便利な関数loadから始めるのが適切です。

于 2012-09-03T10:48:12.763 に答える
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変数に保存します$currency_ratio
  3. すべての計算に比率を使用$currency_ratioして、それぞれについてgoogleにCURLリクエストを行う必要がないようにします。

この方法では、5回ではなく1回のCURL呼び出しのみを実行します。これにより、処理が大幅に高速化されます。

于 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いけば、メソッドがトリガーされます。すべてのコンテンツは variable になりますdata。したがって、あとはそのデータを正しい DIV に配置するだけです。それがこの行の目的です: $('.result').html(data);. これにより、読み込まれたコンテンツがクラス名の div に配置されますresult

基本的にこれだけで十分です。

于 2012-09-03T11:08:11.357 に答える