NTTドコモ様_dカーシェア
NTTドコモ様_dカーシェア
2013.05.15

CakePHP + 更新Ping送信で更新情報サービスを利用する方法

tetsu

こんにちは。流行り(?)に便乗して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送信
    }
}

※注意
コンポーネント化した際の例ですので、全ての要件を満たしているものではありません。