2010年12月23日木曜日

【cronでphpプログラムを定期的に動かす】lcc-hikaku.jp公開に向けて-9

デザインを整えてさっさと公開したいのだけど、その前にphpプログラムをコマンドラインベースで扱うことが研究とかで出てきた。そこで、cronでphpプログラムを定期的に動かしてRSSを取得、パースしてDBに格納するプログラムを作成した。下記にその記録を残す。

phpを普通をコマンドラインで実行するには

#!/usr/bin/php -q

を行の頭に記載する。
/usr/bin/phpはパス。-qはHTTP ヘッダの出力を抑制している。
あとは、コマンドラインで、
php hogehoge.phpという形で叩けばプログラムが動作してくれる。

自分はRSSのパースにsimplepieというクラスライブラリを使用した。

http://phpspot.org/blog/archives/2006/03/rssatomsimplepi.html
http://www.df-cue.com/wp/2009/10/02/simplepie/

を参考にさせてもらいながら、作成。

でもどうも動かないなーと思ったら$feedItems=$feed->get_items();をコメント会うとしていることが発覚。
get_items()しないと要素とれません^^;

というわけで無事動いた。下記がソース。


#!/usr/bin/php -q


<?php


//データベースに接続
$mysql_link = mysql_connect('localhost','mysql_user','mysql_pass');


if (!$mysql_link) {
  die('データベースに接続できません: ' . mysql_error());   
}


//データベースを選択する
mysql_select_db('lcchikaku', $mysql_link);


include('simplepie.inc');    // simplepie.inc を読み込む
$feed=new SimplePie;    // インスタンス生成
$feed->set_cache_location('cache');    // Cache ディレクトリ
$feed->set_feed_url('');    // フィードしたいRSSのURL
$feed->init();    // パースを実行
$feedItems=$feed->get_items();


foreach($feedItems as $item){
  
  $regtime = $item->get_date('Y/m/d H:i:s');    // 各記事の日付
  $title = html_entity_decode(strip_tags($item->get_title()));    // 各記事のタイトル htmlのタグを削除し、htmlエンティティを元に戻している、
  $link = $item->get_permalink();    // 各記事のURL
  preg_match("/&amp;q=(.*)&amp;ct=ga/",$link,$matches); //googleのリンクを削除 ←ここはもっとうまく正規表現以外の方法でgoogleのリンクを削除できる気がする。もし良い方法あったらご教授くださいm(_)m
  $url = $matches[1]; //元のリンクのみ取得
  $summary = $item->get_description();   // 各記事の本文
    
  $sql = "insert into lcchikaku_news (title, summary, url, regtime) values ('$title', '$summary', '$url', '$regtime')";
  $check_sql  =  mysql_query($sql,$mysql_link);  //SQL実行


}


?>

ここで、先輩から

今後、何かコマンドラインベースのプログラムを作ることになったとき、あるディレクトリ以下にディレクトリを掘って作っていくというようなポリシーにしておけば、そのあるディレクトリだけをバックアップすれば、まとめてバックアップしたりすることができ、管理が楽になるとおもう。

とのアドバイスをいただいた。

ln -s リンク元 リンク先

コマンドを使ってシンボリックを作成。これに合わせて、リンク先にcacheディレクトリとsimple.incも移動(mv)

これでcronでphpプログラムを定期的に動かす体制ができた。

0 件のコメント:

コメントを投稿