序章
ここにあなたのコードの修正版があります
$url = "http://stackoverflow.com/";
$loader = new Loader();
$loader->parse($url);
printf("<h4>New List : %d</h4>", count($loader));
printf("<ul>");
foreach ( $loader as $content ) {
printf("<li>%s</li>", $content['title']);
}
printf("</ul>");
出力
新しいリスト : 7
- Joel Spolsky と Jeff Atwood による新しいポッドキャスト。
- サンプルコードの良いサイト/Pyhton
- stackoverflow.com には明らかに、インターネットの歴史の中でこれまでに考えられた最高の Web コードがあり、reddit はそれをコピーし始めたほうがよいでしょう。
- プログラマー向けの reddit のような OpenID を使用した Web サイト
- 素晴らしい開発者サイト。あなたの質問に答えて、知っている人に聞いてください。
- スタック オーバーフローが一般公開されました
- プログラミングQ&Aサイト、Stack Overflow。& Reddit は、インターフェースから多くのことを学ぶことができます!
簡単なデモ
問題
ここで達成したいことがいくつかあります。
- 何とかサブミッションのタイトルをローカルに保存したい
- 現在、ページが読み込まれるたびにいくつかのコードを実行しています
私が理解していることから、必要なのは データの単純なキャッシュコピーであるため、常にURLをロードする必要はありません。
シンプルなソリューション
使用できる単純なキャッシュ システムはmemcache ..
例A
$url = "http://stackoverflow.com/";
// Start cache
$m = new Memcache();
$m->addserver("localhost");
$cache = $m->get(sha1($url));
if ($cache) {
// Use cache copy
$loader = $cache;
printf("<h2>Cache List: %d</h2>", count($loader));
} else {
// Start a new Loader
$loader = new Loader();
$loader->parse($url);
printf("<h2>New List : %d</h2>", count($loader));
$m->set(sha1($url), $loader);
}
// Oupput all listing
printf("<ul>");
foreach ( $loader as $content ) {
printf("<li>%s</li>", $content['title']);
}
printf("</ul>");
例 B
Last Modification Date
ドキュメントが変更された場合にのみ新しいコピーを保存するように、キャッシュキーとして使用できます
$headers = get_headers(sprintf("http://www.reddit.com/api/info.json?url=%s",$url), true);
$time = strtotime($headers['Date']); // get last modification date
$cache = $m->get($time);
if ($cache) {
$loader = $cache;
}
クラスが実装しJsonSerializable
ているため、結果を json エンコードし、MongoDB や MySQL などのデータベースに保存することもできます。
$data = json_encode($loader);
// Save to DB
使用クラス
class Loader implements IteratorAggregate, Countable, JsonSerializable {
private $request = "http://www.reddit.com/api/info.json?url=%s";
private $data = array();
private $total;
function parse($url) {
$content = json_decode($this->getContent(sprintf($this->request, $url)), true);
$this->data = array_map(function ($v) {
return $v['data'];
}, $content['data']['children']);
$this->total = count($this->data);
}
public function getIterator() {
return new ArrayIterator($this->data);
}
public function count() {
return $this->total;
}
public function getType() {
return $this->type;
}
public function jsonSerialize() {
return $this->data;
}
function getContent($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);
$content = curl_exec($ch);
curl_close($ch);
return $content;
}
}