以下は私が作成したコードです。
http://d.hatena.ne.jp/holoholobird/20120319
20分ごとにcronで、20分以内に出てきた記事のitemのみを取得します。
このコードは正常に動作しません。
本来、取得できるはずのitemを取得できないのです。
エラーの原因を探りましたが、自分で思いつくすべての方法を試しましたが無理でした。
恐らくtemp_time周りが怪しいと思うのですが、私の力量では解決は望めませんでした。
20分ごとにRSSの差分を取得するPHPのコードを教えてください。
もしくは上記コードの修正箇所を教えてください。
取得するブログは大半がlivedoorブログとfc2ブログです。
数件、これ以外のウェブサービスによるブログもありますが、
コードがややこしくなるようでしたら無視してもらってもかまいません。
livedoorブログとfc2ブログのフィードの例は
http://hamusoku.com/index.rdf(livedoorブログ)
http://workingnews.blog117.fc2.com/?xml(fc2ブログ)
となります。
よろしくお願いします。
52行目を以下のように修正してみてください。
$temp_time = isset($item["date_timestamp"]) ? $item["date_timestamp"] : strtotime($item["dc"]["date"]);
コメント(4件)
mysql_query($iquery, $link) の戻り値(trueで成功、falseで失敗)は確認しましたか?
ざっくりみただけなので、たぶんですが以下のいずれかではないかと思いました
(a)MySQLのunixtimeフィールドがINT型
$values = の式で$unixtimeを'で囲まないようにする
(b)MySQLのunixtimeフィールドがdatetime型
$unixtime = の式でdatetime型の値を入れるようにする
ちゃんと確認してないのでコメントにしておきます
シェルをたたいて実行すると、ほぼすべてのitemで
PHP Notice: Undefined index: date_timestamp in /var/www/html/getnews.php on line 52
が出てきます。sql自体への登録は成功しています。
正しく動作しているように思います。
>本来、取得できるはずのitemを取得できないのです。
rss側も一定間隔で更新していると思われるのでそのタイムラグが問題のように思います。
例えば20分ごとにcronで、200分以内に出てきた(あるいは全ての)記事を取得し重複する
部分を捨てることで希望の形に近づくように思います。
しかしrssではあらかじめ件数を設定していることもあるのですべてを網羅できるとはかぎりません。
get_headers()でLast-Modifiedが入手できればいいのですがフィードの例のサイトでは出力していませんでした。
時間はあてに出来ないので$siteurlなどで既に登録されているか否かで判断することになると思います。
あるいはフィードのサイトごとに最新の記事の時間を記録し、次回はその時間以降のものを登録する。
>PHP Notice: Undefined index: date_timestamp in /var/www/html/getnews.php on line 52
$temp_time = ($item["date_timestamp"]) ? $item["date_timestamp"] : strtotime($item["dc"]["date"]);
の$item["date_timestamp"]でNoticeとなっているのでisset()やin_array("date_timestamp", $item)とすることで出なくなります。
無事に解決いたしました。