同梱の自動起動スクリプトがおかしい
pgpoolには自動起動用のスクリプトが redhat/pgpool.init として同梱されています。
しかしこれの stop のとこがおかしく、--prefix=/usr 以外でインストールした場合、終了することができなくなっています。
これを修正して、ちゃんと停止するように修正。
stop(){ echo -n $"Stopping ${NAME} service: " if [ $UID -ne 0 ]; then RETVAL=1 failure else $PGPOOLDAEMON stop >> "$PGPOOLLOG" 2>&1 < /dev/null RETVAL=$? if [ $RETVAL -eq 0 ]; then rm -f /var/lock/subsys/${NAME} success else failure fi fi; echo return $RETVAL }
本当は第2引数で smart とか指定できるようにしたかったけど、時間なかったのでこれで。
Formで定義したWidgetを、全てHiddenとして出力する
確認画面で必要になったのですが、意外と簡単に実装できた。
Formクラスの中に下記のようなメソッドを追加して
<?php public function renderHiddenForConfirm() { $txt = ''; foreach ($this as $f) { $id = $f->getName(); if (self::getCSRFFieldName() != $id) { $w = new sfWidgetFormInputHidden(); $txt .= $w->render(sprintf($this->getWidgetSchema()->getNameFormat(), $id), $this->getValue($id)); } } return $txt; }
あとはテンプレート内で
<?php echo $form->renderHiddenForConfirm() ?>
と、するだけです。
ofFormConfirmPluginとかHTML_QuickFormのfreeze,unfreezeの実装だとか既にあったのですが、どう書く?みたいな感じで実装してみました。
scponlyc(chrooted)で接続ができないときの対処
プラグイン内でconfig_handlers.ymlを利用するときにエラーになる
config_handlers.ymlはプラグインの中で定義して、一緒に配布することが可能です。
しかし、バグかどうか分かりませんが、普通に書くとdebug=falseのときにエラーになるようです。
envがprodだろうがdevだろうが関係ありません。
symfonyのバージョンは1.2.7
ダウングレードしてみたけど直らなかったので、ずっとこの状態なのかも。
普通の書き方
config/foo.yml: class: myCustomConfigHandler
これだと Fatal error: class myCustomConfigHandler not found となります。
cache/の中を見てみると、config_config_handlers.ymlとroutingだけで、config_autoload.ymlの生成まですらいっていないようです。
というか、config_autoload.ymlが先に解析されないとダメなんじゃ。。。
回避
クラスが宣言されているファイルのパスを指定します。
config/foo.yml: file: %SF_PLUGINS_DIR%/myPlugin/lib/config/MyCustomConfigHandler.class.php class: myCustomConfigHandler
debugのtrue/falseでエラーになるんだから、バグだと思うんだが。。。
そういえば試行錯誤している途中で、%SF_PROJECT_ROOT%/configにconfig_handlers.ymlを入れて、%SF_PROJECT_ROOT%/libにmyCustomConfigHandler.class.phpを入れてみたけど動かなかった。
もしかして、カスタムハンドラがチュートリアルとかにあるように設定できなくなってる?
openpearでsymfonyプラグインを作るときに注意すること
openpearでパッケージングするときに色々パラメータを設定するのですが、「詳細な設定」のところにある「インストール先」の指定を注意しなければなりません。
デフォルトでは「/」となっておりますが、このままでplugin:installを行うと
plugins/ config/ lib/ modules/ プラグイン名/ config/ README
という風に展開されてしまいます。
公式パッケージのpackage.xmlと見比べると、openpearでパッケージングした方では、
plugins/ プラグイン名/ config/ lib/ modules/ README
といった具合に展開されるようになりました。
実際に使っているのがsymfony1.2なので1.0と1.1がどうなのか分かりませんが、以前は大丈夫だったのでしょうか。
やっと設定ファイルのキャッシュ機構が分かった
どうすればプラグインの中の設定ファイルをキャッシュできるか悩んでいたんですが、分かると簡単でした。
キャッシュを行うにはconfig_handlers.ymlという設定ファイルに、どういった設定ファイルなのか認識させる必要があります。
このファイルはプラグインの中の config/ に置くことも可能です。
書き方はこんな感じ
# config_handlers.yml # 設定ファイルの各ROOTからの相対パス # - sf_root_dir # - sf_root_dir/sf_apps_dir/sf_app_dir # - sf_plugins_dir/* config/foo.yml: config/foo_bar.yml: config/foo/bar.yml: # *も使えます。 config/foo/*.yml: config/foo/*/bar.yml # 指定した設定ファイルに対するパラメータ指定 # 設定ファイルをキャッシュに吐き出すためのパーサークラスの指定 class: sfDefineEnvironmentConfigHandler class: myConfigHandler # 吐き出したパーサーに対してパラメータを渡せます。 param: prefix: foo_ foo: bar
そして、呼び出すときは、config_handlers.ymlで指定したパス名みたいに、各ROOTからの相対パスで書きます。
<?php include sfContext::getInstance()->getConfigCache()->checkConfig('config/foo.yml'); include sfContext::getInstance()->getConfigCache()->checkConfig('config/foo_bar.yml'); include sfContext::getInstance()->getConfigCache()->checkConfig('config/foo/bar.yml');