« [Webサービス]ウォーキングやジョギングした道の距離を測ってくれるWebサービス~キョリ測~ |
メイン
| [Webサービス]名前を入れるだけで性格がわかっちゃう ~性格メーカー~»
[cakePHP]コマンドラインスクリプトで半日ハマったエラーの解決
こんばんは、 CHORD Fusion の高橋純平です。
今日は技術的な備忘録としてのエントリーなのでご了承ください m(_ _)m
ここ(http://tempdocs.cakephp.org/)を参考にしながらcakephp 1.2 でコマンドラインスクリプトを作成。
【Shellプログラム】
/app/vendors/shells/insert.php
【Taskプログラム】
/app/vendors/shells/tasks/record.php
メールを受信したら insert.php を実行して、本文の内容をDBに保存(record.phpで実行)するという流れ。
テストとしてcake.phpをコマンドライン上で実行
/cake/console/cake insert record 2 2008-01-02
引数の1つ目がIDになっていて、既存のレコードがなければ新規登録 / あれば上書き保存という仕組み。
新規登録の場合はうまくいくのだが、上書き保存のときに以下のエラーが出て行き詰った。。。
PHP Fatal error: Undefined class name 'string' in /home/****/cake/libs/model/datasources/dbo_source.php on line 1456
Fatal error: Undefined class name 'string' in /home/****/cake/libs/model/datasources/dbo_source.php on line 1456
dbo_source.phpを見てみると、fieldsという関数の中で呼んでいる String::tokenize()メソッドが認識されていないようだということが分かった。
【原因】
tokenize()メソッドは /cake/libs/string.php 内で定義されているメソッドなので、string.phpをincludeできていないのが原因だった。
【解決方法】
/cake/console/cake.php の__bootstrap()メソッドのincludes に string.php を加える。
日本語で検索しても出てこなかったのだが、google groupsで投げかけている人がいたので助かった。
http://groups.google.co.jp/group/cake-php/msg/e136897070cae911
以下がfix済みのチケット。cake.phpのincludeにstring.phpを含めばよいと書いてある。
https://trac.cakephp.org/ticket/3793
https://trac.cakephp.org/changeset/6312
オープンソースのものを使っていて壁にぶち当たったとき、大抵他の人が先にぶち当たっていたりするので、出てきたエラーで探すと早いですね。
ただ、新しいものであればあるほど日本語での情報は少ないので、積極的に英語を学ぶと共に、日本の仲間への情報共有もしていきたいです。
今回のエントリーも、今後同じエラーに悩む人がいたときの手助けになればうれしいです(^^)
(cakephp1.2がstableとしてリリースされるときには修正されているでしょうけどw)
今日は技術的な備忘録としてのエントリーなのでご了承ください m(_ _)m
ここ(http://tempdocs.cakephp.org/)を参考にしながらcakephp 1.2 でコマンドラインスクリプトを作成。
【Shellプログラム】
/app/vendors/shells/insert.php
【Taskプログラム】
/app/vendors/shells/tasks/record.php
メールを受信したら insert.php を実行して、本文の内容をDBに保存(record.phpで実行)するという流れ。
テストとしてcake.phpをコマンドライン上で実行
/cake/console/cake insert record 2 2008-01-02
引数の1つ目がIDになっていて、既存のレコードがなければ新規登録 / あれば上書き保存という仕組み。
新規登録の場合はうまくいくのだが、上書き保存のときに以下のエラーが出て行き詰った。。。
PHP Fatal error: Undefined class name 'string' in /home/****/cake/libs/model/datasources/dbo_source.php on line 1456
Fatal error: Undefined class name 'string' in /home/****/cake/libs/model/datasources/dbo_source.php on line 1456
dbo_source.phpを見てみると、fieldsという関数の中で呼んでいる String::tokenize()メソッドが認識されていないようだということが分かった。
function fields(&$model, $alias = null, $fields = array(), $quote = true) {
if (empty($alias)) {
$alias = $model->alias;
}
if (empty($fields)) {
$fields = array_keys($model->schema());
} elseif (!is_array($fields)) {
$fields = String::tokenize($fields);
} else {
$fields = array_filter($fields);
}
if (empty($alias)) {
$alias = $model->alias;
}
if (empty($fields)) {
$fields = array_keys($model->schema());
} elseif (!is_array($fields)) {
$fields = String::tokenize($fields);
} else {
$fields = array_filter($fields);
}
【原因】
tokenize()メソッドは /cake/libs/string.php 内で定義されているメソッドなので、string.phpをincludeできていないのが原因だった。
【解決方法】
/cake/console/cake.php の__bootstrap()メソッドのincludes に string.php を加える。
function __bootstrap() {
define('ROOT', $this->params['root']);
define('APP_DIR', $this->params['app']);
define('APP_PATH', ROOT . DS . APP_DIR . DS);
define('WWW_ROOT', 'webroot');
$includes = array(
CORE_PATH . 'cake' . DS . 'basics.php',
CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php',
CORE_PATH . 'cake' . DS . 'libs' . DS . 'object.php',
CORE_PATH . 'cake' . DS . 'libs' . DS . 'inflector.php',
CORE_PATH . 'cake' . DS . 'libs' . DS . 'configure.php',
CORE_PATH . 'cake' . DS . 'libs' . DS . 'cache.php',
CORE_PATH . 'cake' . DS . 'libs' . DS . 'string.php'
);
define('ROOT', $this->params['root']);
define('APP_DIR', $this->params['app']);
define('APP_PATH', ROOT . DS . APP_DIR . DS);
define('WWW_ROOT', 'webroot');
$includes = array(
CORE_PATH . 'cake' . DS . 'basics.php',
CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php',
CORE_PATH . 'cake' . DS . 'libs' . DS . 'object.php',
CORE_PATH . 'cake' . DS . 'libs' . DS . 'inflector.php',
CORE_PATH . 'cake' . DS . 'libs' . DS . 'configure.php',
CORE_PATH . 'cake' . DS . 'libs' . DS . 'cache.php',
CORE_PATH . 'cake' . DS . 'libs' . DS . 'string.php'
);
日本語で検索しても出てこなかったのだが、google groupsで投げかけている人がいたので助かった。
http://groups.google.co.jp/group/cake-php/msg/e136897070cae911
以下がfix済みのチケット。cake.phpのincludeにstring.phpを含めばよいと書いてある。
https://trac.cakephp.org/ticket/3793
https://trac.cakephp.org/changeset/6312
オープンソースのものを使っていて壁にぶち当たったとき、大抵他の人が先にぶち当たっていたりするので、出てきたエラーで探すと早いですね。
ただ、新しいものであればあるほど日本語での情報は少ないので、積極的に英語を学ぶと共に、日本の仲間への情報共有もしていきたいです。
今回のエントリーも、今後同じエラーに悩む人がいたときの手助けになればうれしいです(^^)
(cakephp1.2がstableとしてリリースされるときには修正されているでしょうけどw)
トラックバック(0)
このブログ記事を参照しているブログ一覧: [cakePHP]コマンドラインスクリプトで半日ハマったエラーの解決
このブログ記事に対するトラックバックURL: http://chord-fusion.com/cgi-bin/blog/mt-tb.cgi/27




コメントする