こんにちは。流行り(?)に便乗してPCメガネをかけてみたプログラマーのtetsuです。
今回はブログなどで一般的な機能「更新Ping送信」をCakePHP 2.xで実装する1つの方法を紹介します。
※CakePHPに関する基礎の説明は省略させて頂きます。
準備
実装する前に、必要なライブラリがありますのでダウンロードし、
CakePHPで利用できるようにします。
■IXR ライブラリ
ダウンロードサイト:http://scripts.incutio.com/xmlrpc/
このライブラリは「XML-RPC」に関するライブラリで、
「XML-RPC」形式のデータの形成やデータ送受信などを利用できるライブラリです。
ダウンロード先のサイトに「Download the Library」のリンクからダウンロードします。
ダウンロード後、圧縮ファイルを解凍し「IXR_Library.php」を
CakePHPのアプリケーション側「Vendor」ディレクトリに配置します。
準備は以上です。
実装
それでは実装をしてみましょう。
Ping更新を行いたいコントローラーとアクションを決めます。
ここではコントローラーを「Posts」、アクションを「ping」とします。
//用意するコントローラー
class PostsController extends AppController {
public function ping() {
}
}
まずは設置したライブラリをCakePHPで利用できるように
コントローラーへインポートします。
App::import('vendor', 'ixr');//ここに記述
class PostsController extends AppController {
//省略
}
これで、「Posts」コントローラーで「IXR」ライブラリが利用可能になります。
続いて読み込んだライブラリのインスタンス化をします。
App::import('vendor', 'ixr');//ここに記述
class PostsController extends AppController {
public function ping() {
//「IXR」ライブラリのインスタンス化
$client = new IXR_Client(array('http://rpc.pingomatic.com/'));
}
}
インスタンス化する際に第1引数にPing送信する先を配列で指定します。
ここではWordPressなどで利用されているPingサーバを例にしています。
これで更新Pingの送信ができる状態になりましす。
最後に更新Pingを送信した箇所で次のように記述します。
App::import('vendor', 'ixr');//ここに記述
class PostsController extends AppController {
public function ping() {
//「IXR」ライブラリのインスタンス化
$client = new IXR_Client(array('http://rpc.pingomatic.com/'));
//省略
$title='株式会社LIG';//任意のサイト名
$siteUrl='https://liginc.co.jp/';//任意のサイトURL
$return=$client->query('weblogUpdates.ping',$title,$siteUrl);//Ping送信
}
}
実行すると指定したPingサーバに更新Ping送信が行われます。
送信結果は「$return」に格納されます。
ライブラリを利用するだけで、4行程度で更新Ping送信が実装可能です。
最後に
今回は更新Ping送信を行うのみで紹介していますが、
さらに拡張例として、RSSデータのURLを付与して送信することも可能です。
例)
App::import('vendor', 'ixr');//ここに記述
class PostsController extends AppController {
public function ping() {
//「IXR」ライブラリのインスタンス化
$client = new IXR_Client(array('http://rpc.pingomatic.com/'));
//省略
$title='株式会社LIG';//任意のサイト名
$siteUrl='https://liginc.co.jp/';//任意のサイトURL
$rssUrl='https://liginc.co.jp/feed';//任意のサイトURL
//一度RSSのURLを含めてPing送信
if(!$return=$client->query('weblogUpdates.extendedPing',$title,$siteUrl,$rssUrl)){
//失敗時は通常Ping送信
$return=$client->query('weblogUpdates.ping',$title,$siteUrl);
}
}
}
また、更新Ping送信を行う方法は今回の手法以外に、
PEARを利用した方法もあります。
※ここでは割愛させて頂きます。
おまけ
前述までは説明の為、ハードコーディングですが、
CakePHPの恩恵を受けるためには最終的にコンポーネント化する事をお勧めします。
コンポーネント化した場合の例は次のような例になります。
■UpdatePingComponent.php
App::uses('Component', 'Controller');
App::import('vendor', 'ixr');
/**
* UpdatePing Component
*
* Use IXR Library.
*
* PHP versions 5
*
* Copyright 2013-, LIG inc.
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright 2013-, LIG inc.
* @link https://liginc.co.jp/
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/
class UpdatePingComponent extends Component {
/**
* ping server list.
*
* @var array
*/
public $pingServer=array(
'http://rpc.pingomatic.com/'
);
/**
* client object.
*
* @var object
*/
public $client = '';
/**
* response data.
*
* @var array
*/
public $response=array();
/**
* set client object data.
*
* @param string $pingServer ping server url
* @return bool.
*/
public function setClient($pingServer=''){
if(!is_object($this->client) && !empty($pingServer)){
$this->client = new IXR_Client($pingServer);
return true;
}
return false;
}
/**
* ping method.
*
* @param string $title site title.
* @param string $siteUrl site url.
* @param string $rssUrl site rss url.
* @return array.
*/
public function ping($title='',$siteUrl='',$rssUrl=''){
$this->response=array();
foreach($this->pingServer as $server){
if($this->setClient($server)){
if(!empty($title) && !empty($siteUrl)){
if(!$this->client->query('weblogUpdates.extendedPing',$title,$siteUrl,$rssUrl)){
$this->client->query('weblogUpdates.ping',$title,$siteUrl);
}
$this->response[]=$this->client->getResponse();
}
}
}
return $this->response;
}
}
利用方法は次の通りです。
①「IXR」ライブラリを「Vendor」ディレクトリに配置
②用意したコンポーネント「UpdatePingComponent.php」をアプリケーションの
コンポーネントディレクトリに配置。
○「app」>「Controller」>「Component」>「UpdatePingComponent.php」
③利用するコントローラーでコンポーネントを呼出し。
class PostsController extends AppController {
//コンポーネント呼出し
public $components = array(
'UpdatePing'
);
//任意のアクション
public function add() {
$title='株式会社LIG';//任意のサイト名
$siteUrl='https://liginc.co.jp/';//任意のサイトURL
$rssUrl='https://liginc.co.jp/feed';//任意のサイトURL
$this->UpdatePing->ping($title,$siteUrl,$rssUrl);//Ping送信
}
}
このコンポーネントではコントローラー側で送信するPingサーバを自由に変更できます。
例)
class PostsController extends AppController {
//コンポーネント呼出し
public $components = array(
'UpdatePing'
);
//任意のアクション
public function add() {
$this->UpdatePing->pingServer=array(
//ここにPingサーバのURLを記述
);
$title='株式会社LIG';//任意のサイト名
$siteUrl='https://liginc.co.jp/';//任意のサイトURL
$rssUrl='https://liginc.co.jp/feed';//任意のサイトURL
$this->UpdatePing->ping($title,$siteUrl,$rssUrl);//Ping送信
}
}
※注意
コンポーネント化した際の例ですので、全ての要件を満たしているものではありません。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。