2016-11-28 21 views
-1

私はライブスコアWebサイトを開発しています。目標は5秒ごとにリフレッシュしてキャッシュします5秒ごとにAPIの変更に基づいてウェブサイトの一部を更新します。

APIリクエストはPHPで行われ、データのソートも行われます。しかし、私はAPIリクエストの更新部分を実装することに苦労してきました。バックグラウンドでAPIリクエストを更新し、5秒ごとにウェブサイトを更新するためのJavaScriptが必要なので、5秒ごとに新しいデータを取得できます。

私はいくつかの助けを得たいです。私はCRONでやってみたいですが、ホストは5秒ごとにCRONを実行するようにはしていません。私の問題に対する解決策はありますか?私は非同期に5秒ごとにPHPでapi呼び出しを実行します

+0

ようこそスタックオーバーフロー。あなたはあなたの質問を改善することができます。 [質問する方法](http://stackoverflow.com/help/how-to-ask)の「質問をスマートにする方法」のリンクを参照してください。 – zhon

答えて

0

最も簡単な方法は、PHPスクリプトを5秒ごとに新たに実行するのではなく、無限ループで実行することです。以下のような

何か:

#!/usr/bin/env php 
<?php 

while (true) { 
    CacheStuff(); 
    sleep(5); 
} 

その後複数回実行し、それを防ぐために群れのようなものを使用してのcronでそれをトリガーします。

* * * * * flock -n /var/lock/cache_script.lock /path/to/myscript.php 
1

これはcronなしで実行できます。このようなものが動作します:

  • ユーザーのブラウザからAPIにリクエストが送信されます。
  • APIはキャッシュに値が存在するかどうかを確認します(Memcached?)。その後、
  • 何のキャッシュエントリが存在しない場合は、お使いのAPIは、発信要求を行う、並べ替え/応答を処理し、cronのソリューションと比較して5+秒

優位の有効期限でそれをキャッシュ - なしがある場合あなたのウェブサイト上のアクティブなユーザーは、不必要な発信要求はありません。

ブラウザ側でウェブソケットを使用することも考えられます。

+0

私は実際にいくつかの会社のライフコアベースのAPIにapiリクエストを行うことを意味していました。そのデータをキャッシュし、誰かがWebサイトをロードすると、キャッシュに5秒ごとにリクエストを行い、キャッシュが5秒を超えると新しいapiリクエストが実行され、そのデータが再びキャッシュされます。そして、これは基本的に無限にループしています。 –

+0

@SandiKarajicはい、私は正しく理解しました。私の答えはまだ正しいです。 'cron'の実装とは異なり、私のやり方はオンデマンドです。ユーザーも負荷もありません。ユーザーには外部のAPIリクエストがあります –

0

私の仮定: はあなたがcronを、memcachedの、Redisのなど(基本的なホスティング問題)あなたはJSONオブジェクトとしてファイルにデータを保存することができます

サンプルのためのあらゆる機会を持っていけません。例えば

は、あなたのファイル名は、「5分-data.json」

はので、あなたのコードが可能です。

$timeout_sec = 5; 
$file_path = '5min-data.json'; 
if (file_exists($file_path) && ((filemtime($file_path) - time()) < ($timeout_sec * 60))) { 
    $data = json_decode(file_get_contents($file_path), true); 
} 
else { 
    //produce your data here as array, it is only sample 
    $data = [ 
     'brand' => 'Mazda', 
     'model' => 'Mzd3', 
     'year' => 2016, 
     'weight' => 1234.5, 
     'airbags' => [ 
      'front-left', 
      'front-right', 
      'back-left' 
     ] 
    ]; 
    file_put_contents ($file_path, json_encode($data)); 
} 
//$data is fresh 
関連する問題