2日目
2日目は、1日目でできたページをDB保存、読込を取り入れたページに改修していきます。
なお、cronの設定については本記事では説明しません。
今回想定する環境
さくらのレンタルサーバ スタンダードプラン
PHPバージョン 5.6
MySQLバージョン 5.5
InnoDB
utf_general_ci
使用ライブラリ MagpieRSS
事前準備など
DBを用意する
パースしたRSSの保存先となるDBが新しく必要です。
もしさくらのレンタルサーバでWordpressを使用しているなどの理由から、
既にDBをいくらか作成しているなら新たに作成した方が良いです。
さくらのレンタルサーバはサーバコントロールからDBを新規作成できます。
アプリケーションの設定 → データベースの設定 → データベースの新規作成 を開き
各項目を指定してDBを作成します。
テーブルを作成する
DBを新規作成したら、次にテーブルを作成します。
1日目で触れた次の項目にIDを加えます。
- サイトのタイトル
- サイトのindexページリンク
- 記事のタイトル
- 記事のリンク
- 投稿日
- 内容
ここではlinkをキーにして、記事のリンクが重複しているデータを排除するようにしています。
構築の流れ
想定する仕組み
処理の流れとしては、
- cronで定期的に新しいデータ取得
- ユーザがindex.phpを開く時にDBからデータ取得、表示する
- cronで定期的に古いデータ削除
今回はメンテナンス性を上げるために4ファイルに分離しました。それぞれの働きは次の通り。
crowrer.php
cronで定期的にデータを取得してDBに追加するスクリプト。
dbController.php
mysqlの操作をまとめたファイル。
cfg.php
共通して使用する文字列をまとめたファイル。
index.php
ブラウザに表示する部分を出力するファイル。
なお、これらだけだとデータの削除は行わないため、DBにデータが溜まっていくだけになります。
削除は別途cronで流すスクリプトを用意するなどして
メンテナンスすることになりますが、ここでは紹介しません。
ソースコード:crowrer.php
getMessage());
exit;
}
/**
* RSSデータ取得
*/
echo $no;
foreach ($rssUrl as $no => $rss_url) {
if ($rss_url != '') {
// URLからRSSを取得
$rss = fetch_rss($rss_url);
if ($rss != NULL) {
for ($i = 0; $i < count($rss -> items); $i++) {
$rss -> items[$i]["site_title"] = $rss -> channel["title"];
$rss -> items[$i]["site_link"] = $rss -> channel["link"];
}
// itemsを格納
$rssItemsArray[] = $rss->items;
}
}
}
/**
* RSSデータをDBへ追加
*/
$concatArray = array();
if (is_array($rssItemsArray)) {
for($i = 0; $i < count($rssItemsArray); $i++){
$concatArray = array_merge($concatArray, $rssItemsArray[$i]); // 配列を統合する
}
foreach ($concatArray as $no => $values) {
// RSSの種類によって日付を取得
if($values['published']){
$date = $values['published'];
}elseif($values['created']){
$date = $values['created'];
}elseif($values['pubdate']){
$date = $values['pubdate'];
}elseif($values['dc']['date']){
$date = $values['dc']['date'];
}
$date = date(
"Y-m-d H:i:s", strtotime($date)
);
/**
* フィルター
*/
// 現在時刻の取得
$nowtime = date(
"Y-m-d H:i:s",
strtotime( "now" )
);
if($date > $nowtime){ // 未来記事の排除
}elseif(preg_match("/AD/", $values["title"])){ // 広告記事の排除
}elseif(preg_match("/PR/", $values["title"])){ // 広告記事の排除
}else{
// 値の定義
$title = $values["title"];
$link = $values["link"];
$site_title = $values["site_title"];
$site_link = $values["site_link"];
$description = $values["description"];
// 記事ごとに必要な項目を抽出
$rssArray[] = array(
$date,
$title,
$link,
$site_title,
$site_link,
$description
);
}
}
/**
* ソート
*/
function cmp($a, $b) {
if ($a[0] == $b[0]) return 0;
return ($a[0] > $b[0]) ? -1 : 1;
}
if($rssArray) {
usort($rssArray, 'cmp');
}
if(count($rssArray) > $num){
$count = $num;
}else{
$count = count($rssArray);
}
/**
* 必要な件数分だけHTML整形
*/
for ($i = 0; $i < $count; $i++) {
$date = date("Y-m-d H:i:s",strtotime($rssArray[$i][0]));
$title = $rssArray[$i][1];
$link = $rssArray[$i][2];
$site_title = $rssArray[$i][3];
$site_link = $rssArray[$i][4];
$datelink = "$date";
$titlelink = "$title";
$description = $rssArray[$i][5];
$site_titlelink = "[$site_title]";
// 格納
$stmt = $dbc -> prepare("insert into ".$db['table']." (title,link,site_title,site_link,date,description) values (?,?,?,?,?,?)");
$stmt -> execute(
array(
$title,
$link,
$site_title,
$site_link,
$date,
$description
)
);
}
}
/**
* DBから切断
*/
disconnect($dbc);
?>
ソースコード:dbController.php
query($sql);
$rss_data;
$count = 0;
foreach ($stmt -> fetchAll(PDO::FETCH_ASSOC) as $data) {
$date = date('Y年m月d日 G:i',strtotime($data['date']));
$title = ($data['title']);
$link = ($data['link']);
$site_title = ($data['site_title']);
$site_link = ($data['site_link']);
$description = ($data['description']);
$rss_data[$count] = array(
$title,
$link,
$site_title,
$site_link,
$date,
$description
);
$count++;
}
return $rss_data;
}
?>
ソースコード:cfg.php
ソースコード:index.php
getMessage());
exit;
}
/**
* ページ出力部分
*/
$rss_data = getData($dbc);
echo "";
for ($i1 = 0; $i1 < count($siteUrl); $i1++) {
// サイトタイトル
echo "";
echo "".$siteTitle[$i1]."
\n";
// 記事
echo "\n";
for ($i2 = 0; $i2 < count($rss_data); $i2++) {
if($siteUrl[$i1] === $rss_data[$i2][3]){ // サイトURLが同一ならecho
// 各種代入
$title = $rss_data[$i2][0];
$link = $rss_data[$i2][1];
$site_title = $rss_data[$i2][2];
$site_link = $rss_data[$i2][3];
$date = $rss_data[$i2][4];
$description = $rss_data[$i2][5];
// 記事出力
echo "- ".$date.'
'.$title.'
'.mb_strimwidth($description, 0, 600, "...")." \n";
}
}
echo "
\n";
echo "";
}
echo "";
/**
* DBから切断
*/
disconnect($dbc);
?>