CodeIgniterの学習 44 - PEARをCodeIgniter上で使えるようにする

今日はPEARをCodeIgniter上で使えるようにする。簡単なネタ。

全くの新規開発ではなく、
過去に開発したプログラムを短時間で移植したい場合など、事情によってはPEARを使いたい場合も有るだろう。

元ネタは http://codeigniter.com/wiki/PEAR_integration/ だけど、ウチの環境に合わせて作業履歴を書いておく。


元ネタと違う理由

単純にウチの構成上の問題。

理由1)
昨日のエントリ(CodeIgniterの学習 43 - ログ出力をZend_Logに置き換える http://d.hatena.ne.jp/dix3/20081117/1226870236)の絡みで、
hookを使わずにドキュメントルート/index.phpini_set( 'include_path', APPPATH . 'my_classes/' ) しているので、ついでにここでinclude_pathを追加した方が分散しなくて良いから。


理由2)
ソース構成上

  • application/my_classes/pear 以下にPEAR関連のソース群
  • application/my_classes/Zend 以下にZend Framework関連のソース群
  • application/my_classes/hogehoge 以下にhogehoge関連のソース群

という様に、CodeIgniterネイティブの書き方ではない外部ソース群を設置したいから。
(my_classesは、CI標準のディレクトリではない。)


作業履歴

手順1:pear用のインクルードパスを index.phpに追加する。

hookを使わない理由は、理由1のとおり。

ドキュメントルート/index.php

<?php
//上略

//独自のインクルードパスを追加するようにする
ini_set( 'include_path', APPPATH . 'my_classes/' . PATH_SEPARATOR . APPPATH . 'my_classes/pear' );

/*
|---------------------------------------------------------------
| LOAD THE FRONT CONTROLLER
|---------------------------------------------------------------
|
| And away we go...
|
*/
require_once BASEPATH.'codeigniter/CodeIgniter'.EXT;

/* End of file index.php */
/* Location: ./index.php */
 ?>

みたいなかんじ。



手順2:pearのソースをapplication/my_classes/pear以下に設置する
/usr/share/pearディレクトリを丸ごとapplication/my_classes/pearにコピーする。(FedoraCore8環境の場合)
丸ごとコピーなら使わないライブラリも一杯コピーされるけどね。



手順3:http://codeigniter.com/wiki/PEAR_integration/のPearloader.php を 新設する

http://codeigniter.com/wiki/PEAR_integration/の 3. Use It! の箇所にある
Pearloader.php をコピーして、application/libraries/Pearloader.php として設置する。


動作確認

元ネタと同様に外部URLの画面をスクレイピングする例。
ほぼ元ネタを踏襲していてこのエントリに独自性がないので、
ついでにZend Frameworkでのスクレイピング例も書いておく。単純なGETの例。


POSTとCookieを組み合わせた複雑なスクレイピング例は、
迂闊に多用すると外部に負荷を掛けまくって危険なので、この日記では書かない。
以後も書くつもりはない。(GETでも同じ事がいえるけどね。)


極力WEBAPIが公開されているものだけ使いましょう。


ソース:
適当なコントローラで、

<?php
//上略
function index()
{
  //pearを使った例
  $this->load->library('pearloader');
  $http_request = $this->pearloader->load('HTTP','Request');
  $http_request->setURL('http://www.example.com/');
  $http_request->sendRequest();
  var_dump( $http_request->getResponseBody());

  //おまけ Zend_Httpを使った例
  require_once('Zend/Http/Client.php');
  $client = new Zend_Http_Client();
  $client->setConfig(array('maxredirects' => 0,'timeout'=>30));
  //GETパラメータのセット
  $client->setParameterGet(array(
      'foo'  => '1',
      'bar' => '2',
  ));
  $client->setUri('http://www.example.com/search');
  $response = $client->request();
  var_dump($response->getBody());
  //GETパラメータのリセット
  $client->resetParameters();

}
//下略
 ?>

みたいに呼んでみる。
別にpearloaderを作って一枚噛まさなくても、require_once して new すれば良いだけなんだけどね。


どっちかというと、他のサンプルソースをまんまコピペできてミスが少なそうだから、
pearloaderを使わずに、require_onceで直接書いた方が俺は好き。
疎結合の意味では噛ます意味もあるか?うーん、あまり無さそう)


画面:
こんなかんじ。var_dump2つ。



dix3はようなしをてにいれた!



http://d.hatena.ne.jp/dix3/20081120/1227110213 に、改造版pearloaderのエントリーを追加しました。