昨日はYii FrameworkからMongoDBに接続してみましたが、 今日はYii FrameworkからSolrに繋いでみます。 #なんとなく感覚的にはRDBMSとMongoDBとSolrが使えれば、それっぽいサービス作れるのかな、と。 YiiのページでSolrのExtensionを探してみると、以下2つがヒットします。 - solr(http://www.yiiframework.com/extension/solr) - yii-solr(http://www.yiiframework.com/extension/yii-solr) yii-solrの方が新しいしFollowerも多いので、今回はyii-solrを試してみます。 ■ Solrのインストール サンプルを動かすだけならSolrのページ(http://lucene.apache.org/solr/)から アーカイブをダウンロードしてきて、解凍してサンプルに移動して ↓のようにjava -jar start.jarするだけです。非常に簡単。
C:>cd C:apache-solr-3.6.0example C:apache-solr-3.6.0example>java -jar start.jar 2012-06-13 10:50:25.199:INFO::Logging to STDERR via org.mortbay.log.StdErrLog 2012-06-13 10:50:25.327:INFO::jetty-6.1-SNAPSHOT 6 13, 2012 10:50:26 午前 org.apache.solr.core.SolrResourceLoader locateSolrHome
■ yii-solrのインストール yii-solrのGithubページ(https://github.com/phpnode/YiiSolr)のReadmeに やり方が記載されています。 昨日もそうでしたが、peclが動いてくれないので、、 http://downloads.php.net/pierre/ から php_solr-5.3 っていうリンクの アーカイブ落としてきて解凍してxampp/php/extに配置します。 続いて、プロジェクトのルートディレクトリ直下にpackagesというディレクトリを作成して、 main.phpでaliasしなさいと。
"aliases" => array( "packages" => dirname(__DIR__)."/packages/", ),
packages/solrにファイルを展開しろとのことなのでそうします。 とりあえずインストールは完了した予感です。 ■ YiiからSolrに接続(1) ReadmeはTDDな感じで記載されていて、testディレクトリから↓叩け、と。 「先生、テストディレクトリがありません!」って感じなんですがww
phpunit --verbose ../packages/solr/tests
ってかPHPUnitするのにPHPのエクステンションが必要って話なので↓
C:YYYxamppphp>pear install phpunit/PHPUnit-beta WARNING: channel "pear.phpunit.de" has updated its protocols, use "channel-update pear.phpunit.de" to update Did not download optional dependencies: phpunit/PHP_Invoker, use --alldeps to download automatically phpunit/PHPUnit requires PEAR Installer (version >= 1.9.4), installed version is 1.7.2 phpunit/PHPUnit can optionally use package "phpunit/PHP_Invoker" (version >= 1.1.0) ~略~ Starting to download YAML-1.0.6.tgz (10,010 bytes) .....done: 10,010 bytes install ok: channel://pear.symfony-project.com/YAML-1.0.6
■ YiiでPHPUnitしてみる YiiのTestingの2. Test Environment Setupを読むと、 yiicでプロジェクト作ると、Test用のディレクトリが出来るはずだって書いてある…。 ↓やってみるとソレっぽいのが出来たっぽいです。
C:YYYeclipse-phpworkspaceYYY>C:YYYxamppphpphp.exe C:YYYeclipse-phpworkspaceYYYyii-1.1.10.r3566frameworkyi ic.php webapp testdrive Create a Web application under 'C:YYYeclipse-phpworkspaceYYYtestdrive'? [yes|no] yes mkdir C:/YYY/eclipse-php/workspace/YYY/testdrive mkdir C:/YYY/eclipse-php/workspace/YYY/testdrive/assets mkdir C:/YYY/eclipse-php/workspace/YYY/testdrive/css ~略~ mkdir C:/YYY/eclipse-php/workspace/YYY/testdrive/themes/classic/views/layouts mkdir C:/YYY/eclipse-php/workspace/YYY/testdrive/themes/classic/views/site mkdir C:/YYY/eclipse-php/workspace/YYY/testdrive/themes/classic/views/system Your application has been created successfully under C:YYYeclipse-phpworkspaceYYYtestdrive.
画面からアクセスしてみると↓ ↓エクスプローラーから見た感じテストディレクトリもOKそう が、テストしてみると↓Selenium RC serverが、、、って悲しい事になってますw
C:YYYeclipse-phpworkspaceYYYtestdriveprotectedtests>C:YYYxamppphpphpunit.bat functional/SiteTest.php PHPUnit 3.5.14 by Sebastian Bergmann. EEEEEE Time: 13 seconds, Memory: 5.25Mb There were 6 errors: 1) SiteTest::testIndex PHPUnit_Framework_Exception: Could not connect to the Selenium RC server.
■ YiiSolrでPHPUnit んま、とりあえず先進むべって事で、上記で作ったpackagesディレクトリを testdriveの方に持ってくることにしました。main.phpも書き換えておきます。 ってことで、YiiSolrでPHPUnitを試みます。 ↓ことごとくNo such file or directoryで落ちてる…orz
C:YYYeclipse-phpworkspaceYYYtestdriveprotectedtests>C:YYYxamppphpphpunit.bat --verbose ../packages/solr/test PHPUnit 3.5.14 by Sebastian Bergmann. .EEEEEEEE...EEEEEEEEEEEEEE Time: 0 seconds, Memory: 8.25Mb There were 22 errors: 1) ASolrConnectionTest::testIndexAndDelete include(SolrInputDocument.php): failed to open stream: No such file or directory C:YYYeclipse-phpworkspaceYYYyii-1.1.10.r3566frameworkYiiBase.php:418 C:YYYeclipse-phpworkspaceYYYyii-1.1.10.r3566frameworkYiiBase.php:418 C:YYYeclipse-phpworkspaceYYYtestdriveprotectedpackagessolrtestsASolrConnectionTest.php:32 2) ASolrConnectionTest::testFacetedSearch include(SolrInputDocument.php): failed to open stream: No such file or directory
そういえばphp.iniにextension=php_solr.dll入れるの忘れてた。。 って事で、追記してもっかい走らせたら、今度はCurlがないとか…↓ php_curl.dllもダウンロードしてきてphp.iniに追記してもっかい。 ↓久しぶりに気持ちイイ感じ。
C:YYYeclipse-phpworkspaceYYYtestdriveprotectedtests>C:YYYxamppphpphpunit.bat --verbose ../packages/solr/tests PHPUnit 3.5.14 by Sebastian Bergmann. .......................... Time: 8 seconds, Memory: 14.50Mb OK (26 tests, 3119 assertions)
■ YiiからSolrに接続(2) main.phpのcomponentsの所にに↓の定義を追加します。
"solr" => array( "class" => "packages.solr.ASolrConnection", "clientOptions" => array( "hostname" => "localhost", "port" => 8983, ), ),
#最初、うっかり一番下に追記したら"CWebApplication.solr" is not defined. #って言われて焦りました。記述するのはcomponentsの中です。 んま、そんなこんなで、SiteControllerのactionIndexに↓のコードを突っ込んで、
$doc = new ASolrDocument; $doc->id = 123456789; $doc->name = "hoge document"; $doc->save(); // adds the document to solr $doc->getSolrConnection()->commit();
でもって画面から叩いたら、そんなクラスねぇみたいな事いわれて。 何かと思ったら、main.phpでpackagesを宣言するところが、 Solr関連のimportするとこより前にないとダメじゃんっていう。 ↓こんな感じで。
'aliases' => array( 'packages' => dirname(__DIR__).'/packages/', ), // autoloading model and component classes 'import'=>array( 'application.models.*', 'application.components.*', 'packages.solr.*', ),
最終的に画面から叩いた後にSolrの管理画面みると、、、 ↓無事入っておりましたとさ。 めでたしめでたし。 #ってか、そもそものYiiのお勉強をもうちょいしないとなw