3

デスクトップマシンの電源がオフになっているときに「投稿」を見逃さないように、NASドライブにローカルにRSSフィードをキャッシュする個人的なプロジェクトがあります(組み込みのWebサーバーとchronジョブを使用)。

これまでのところ、MySQLデータベースに単一のフィードのキャッシュを格納する簡単なphpスクリプトを設定しています。これを拡張して複数のフィードを含め、それらすべてをループしますが、今のところ、自分がやりたいことが可能であることを確認したいだけです。SimplePieは有効期限が切れるとキャッシュをクリアするので、アーカイブのように使用する「cache_data」テーブルと「items」テーブルのコピーを作成することを考えていました。すべての新しいレコードを新しいテーブルにコピーする場合、SimplePieであるかどうかは関係ありません。私はすでにアイテムのコピーを持っているので、それはそれ自身のキャッシュテーブルです。

ここで行う必要があるのは、出力rss / xmlファイルを作成することです。これに、SimplePieを使用できるかどうか疑問に思っています。2つの可能性があります。

  1. SimplePieを入手して、「アーカイブ」テーブルをキャッシュの場所として使用します。有効期限が無効になっているため、何も削除されません。
  2. 「arcive」テーブルから自分でデータを読み取り、SimplePieを使用してデータを処理し、RSSフィードを作成します。

SimplePieのドキュメントとSimplePie.incを調べて、正しい方向を示すものが見つかるかどうかを確認しましたが、これは私の最初の実際のphpプロジェクトであり、SimplePieにはかなり複雑なコードが含まれています。任意の提案やポインタをいただければ幸いです:)

4

1 に答える 1

1

独自のSimplePie_Cacheクラスを作成し、キャッシュテーブル、memcached、ファイルシステムなどから取得および設定するコードをメソッドに入力します。知っておく必要があるのは、各関数のキャッシュキーの名前として$this->nameを使用することだけです。

class MySimplePie_Cache extends SimplePie_Cache {
/**
 * Create a new cache object
 *
 * @param string $location Location string (from SimplePie::$cache_location)
 * @param string $name Unique ID for the cache
 * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
 */
  function __construct($location, $name, $extension) {
    $this->name = $name;
  }

  static function create($location, $filename, $extension) {
    return new MySimplePie_Cache($location, $filename, $extension);
  }

  function save($data) {
     // TODO: save $data to $this->name cache entry
     return true;
  }

  function load() {
     // TODO: load $data from $this->name cache entry
     return $data;
  }

  function mtime() {
    return time(); // this will disable any expiration checks
  }

  function touch() {
    return true; // not necessary, we don't need to update times, no expiration
  }

  function unlink() {
    return true;  // nothing will be removed from the cache
  }
}

次に、キャッシュクラスをフィードに登録します。

$feed = new SimplePie();
$feed->set_cache_class("MySimplePie_Cache");
于 2012-07-11T06:07:56.547 に答える