CakePHPで作ったサイトの特定のアドレスにアクセスして更新したい
ネットで情報を探したのだけれど表題のシンプルな方法がわからなかったので書く。結論としては意外とwgetが使えた。
CakePHPでサイトを作ったがいいがcronの使い方がわからない
CakePHPで簡単なデータベースサイトを作った。データベースなので適度に内容を更新していかなければならない。
cronは自動設定した時間に命令をこなしてくれる仕組み。ぼくもそんなに詳しくない。
前提を書いておくと、CakePHPで作ったサイトで、アドレスにアクセスするとtwitterの情報をクローリングしてmysqlデータベースを自動更新してくれるプログラムを走らせるようにしたかったのだけれどうまくいかず、手入力でアクセスして自動更新するには量が多すぎるのでくじけていた。
24時間表記で時間を数字として取得して時間×100番目から100個アイテムを取り出してそれを更新する仕組みにしていたが、深夜にわざわざアクセスして更新できないので200~600番台の更新がうまくいかない形に。(何番目からはじめるか指定するプログラム書けよって話なのだけれど自動更新を念頭にプログラム書いてたのでその辺はツッコミなしで)。
サイトを自動更新するにはcronを使うがうまく動かない
cakePHPの場合、webを検索してみるとwebrootにphpファイルをつくって
cd cd /home/アカウント名/www/; /usr/local/bin/php index.php
とかで自動で実行してくれる方法と、シェルをつくってそいつをbakeしろ方法と出てくるがどちらも細かい仕様がわからないので煩わしい。
CakePHPのControllerでupdate()をつくる
例です。Controrllerフォルダに、ファイル名はCakePHPの命名規則に従って適当に作ってください。
public function update(){
$date = date('G');//24時間表記で今何時かを数字で返してくれる
$products=$this->Product->find(
'all',array(
//なんか検索条件
'limit' => 100,
'offset' => $date*100,
)
//foreachとかをつかってデータを一つづつ取り出しクローリングする命令を書く
//例えば$dataに配列で更新情報を入れたら$this->Product->save($data)を忘れずに。
}
viewでupdate.ctp
をつくれば、http://*******.sakura.ne.jp/product/update/
にアクセスすると自動でアップデートが行われるようになります。update.ctp
には何も書かなくても良いのだけれど<?php var_dump($data); ?>
とかでちゃんと更新情報が入力されてるか確認するといい。
wget --spiderをつかってできないか試してみた
cronでもwgetというアクセスしたurlからhtmlファイルを取り出して保存してくれる命令がある。wget --spider
をつかうとファイルにアクセスして存在があるかどうかを確かめてくれる(要は保存しない)ようになる。
webで調べてみたらクオーテーション("http://~~")でくくらないといけないなどと書いてありましたが、さくらのcronだとクオーテーションいりませんでした。ここで20分くらいハマってました。
macのターミナルにwgetは入っているので$wget --spider "http://*******.sakura.ne.jp/product/update/"
を入力し、データベースが更新されたかを確認。
さくらのcronで動かしてみる
macのターミナルなどでwgetがうまくいったら、一時間後か時間が変わったあたりで、さくらのcronを動かしてみる。さくらのサーバコントロールパネルへ>CRONの設定>>> 新規項目の追加をクリック。何度もいうけれど、アクセスしたいアドレスはクオーテーションいらない。実行コマンドのところに以下の命令を入力。さくらの場合、単純にwget --spider
を入力するのでなく/usr/local/bin/wget --spider
としなければならないところに注意。
/usr/local/bin/wget --spider http://*******.sakura.ne.jp/products/update/ 1> /dev/null
実行時間の分のところに数字を入力すると、毎時間のその時間にプログラムを実行してくれる。一旦2分後に設定して送信をクリック。2分待って、データベースが更新されているかを確認。
クローリングはサーバにかなりの負荷をかけるらしいので、各自の判断で行ってください。僕が今回つかったtwitter APIのユーザ情報取得の場合、15分で180リクエストまで許容されるので、それ以上のリクエストを送るとエラーが起きて更新できなくなるので注意。