それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

symfonyに出てくるSpycって?

YAMLのパーサーらしい。YAMLに記述ミスがあると、Spyc.phpがエラーになる。そのエラーメッセージわかりにくい。

xdebugを入れてみた

stack traceが出るように、xdebug入れてみる。

sudo pear install pecl/xdebug
sudo echo extension="xdebug.so"  >> /etc/php5/apache2/php.ini

なんだろう。明らかにパフォーマンスに影響するんだけど。zend framework使ってると、こういうの要らないんだけどなぁ・・・loadClass周りだけZend Framework使うように変更にするかなぁ・・・

環境は ubuntu-desktop 6.10 ja apache2(php5.1.6) + eaccelerator +zend optimizer

Spycの代わりにsyckを使う。

YAMLのパーサーモジュールsyckがある。frontend_dev.php/:module/:action でアクセスすると上の方二に見えるvar&logをクリックしたときに見えるあれだ。入れてみよう。


もちろん、いちいちbuildするとUPDATEが面倒なのでいつもの通りapt-get

sudo aptitude search syck
sudo aptitude install libsyck-dev

がっ。php5-syckがない。syckのモジュールをPHPから使うphp5/extensionは自分でphpizeするしかなさそう。

wget http://rubyforge.org/frs/download.php/4492/syck-0.55.tar.gz 
tar -zxvf syck-0.55.tar.gz 
cd syck-0.55/ext/php/ #PHPのExtensionソースはここ

あとは、マニュアルphpizeで共有モジュールをコンパイルする方法に従ってコンパイル、phpdynamic link として組み込み、Apache再起動

phpize
./configuer
make
sudo make install
sudo echo extension="syck.so" >> /etc/php5/apache2/php.ini
sudo /etc/init.d/apach2 restart

つーか、もしかして、aptitude 要らなかった?


実行速度眺めてたら5%位早くなったかな。動的モジュール使ってこの程度だからsymfonyのキャッシュは良くできてるんだろうな。

Spyc.php と syck.so で微妙に解釈が違う?

:の後の空白の有無とか微妙に解釈が違うっぽい。syckの方が厳格だ。

list:
  display:[ =entry ] #スペース省略するとSypcはOK.syckはパース失敗してた

syck使うとエラーメッセージがますますわかりにくくなった。どうせ、_dev以外のリリース版ではYAMLのパース結果はキャッシュしてるだろうし。syckは諦める。

symfonyはキャッシュで動いている

どうもsymfonyはキャッシュで動いているようだから。キャッシュを有効活用してみた方がよさそう。とりあえず、Xdebugは重かった。frontedn_dev.phpの実行時間3倍以上だ。。symfony程クラスになると読み込んでるモジュールやファイルが多いからXdebug向いてないのかも。frontend_dev.php じゃなくて index.phpでアプリにアクセスするとxdebugsymfonyがOFFにしてるみたい。早い。でもテスト開発環境が遅いのも困りものだよなぁ。

キャッシュ使うためにAPC+eAcc+ZendOptimizerとかしてみた。意味無いか。ついでにxcacheも入れようか。

右上のvar&configが気にナル

debug xdebug logging cache eaccelerator apc xcache compression syck

がキニナル。xdebug eAccelerator APC xCacheはわかるPECLとかで見かける、PHPのモジュールだから。syckは検索すればわかった。

compressionは?

zlib.output_compression = On
zlib.output_compression_level = 2

の事だろうな。と思ったが違うようだ。


/apps/APP/config/settions.yml なのかなぁ

all:
  .settings:
    compressed: on

お、動いた。php.ini書き換えなくても良いのか。

SymfonyはE-tagも作ってくれる。

HTTP通信でブラウザ&プロキシのキャッシュ制御には last-modified かE-tag。
これいちいち書き出すの面倒。あるとないでは、負荷が違う。これsymfonyに任せてみる。
/apps/APP/config/settions.yml なのかなぁ

all:
  .settings:
    compressed: on
    etag: on        # Enable etag handling

楽だ。この辺が管理画面から出来るともっと楽なんだけど。プラグイン無いのかな。

symfonyのコントロールパネル

http://www.symfony-project.com/trac/wiki/sfControlPanelPlugin
コントロールパネルプラグインがあった。sfControlPanelPluginという名前

インストールと、呼び出しはとてもSimple。Good Jobだね。ソースも見られるなら、Editorも内蔵してくれればいいのに。

symfonyにテーブルを作らせた方が嬉しい

symfonyにテーブルを作らせた方が楽に思えてきた。
schema.ymlにカラムの定義を書くのだけれど。書き方わからん

symfony prople-build-schema

で試しにスキーマファイルをつくる。

あとは、それを真似ると良い。

ただ、特殊な書き方があるらしい。

カラム名を書いて定義を空にするとsymfonyが自動処理

Empty Columns //空のカラム定義のこと

When meeting a column with no value, symfony will do some magic and add a value of its own. See Listing 8-31 for the details added to empty columns.

//カラム定義を、空っぽにしておくと、symfonyは特殊な値を自動的に追加してくれる。特殊カラム定義のパターンは以下の通り。

Listing 8-31 - Column Details Deduced from the Column Name

// Empty columns named id are considered primary keys
// "id: " と書かれた、空カラム定義はPK定義に書き換わる
id:         { type: integer, required: true, primaryKey: true, autoIncrement: true }

// Empty columns named XXX_id are considered foreign keys
// "XXX_id: " と書かれた空カラム定義は foregin key になる。
//    XXXテーブルの id を参照する外部キー
foobar_id:  { type: integer, foreignTable: db_foobar, foreignReference: id }

// Empty columns named created_at, updated at, created_on and updated_on
// are considered dates and automatically take the timestamp type

// created_at と update_on と書かれた定義は timestamp型になる
// また更新時にsymfonyが自動で値を挿入する
created_at: { type: timestamp }
updated_at: { type: timestamp }

For foreign keys, symfony will look for a table having the same phpName as the beginning of the column name, and if one is found, it will take this table name as the foreignTable.
// foreign keysを定義するときに、symfonyはphpNameを見てそれの定義からカラム名を類推し、外部テーブルとして採用する。(この訳いい加減 たぶん XXX_userid とかけば XXXテーブルの userid を、 XXX_idと書けば、XXXテーブルのid 参照するって事だろう。。)

追記

マニュアルをもう少し読み込んでみた。
phpName は カラム定義で

_attributes: {phpName : XXXX }

と書いた名前のこと。

だから、

ABC_key :

と書けば

Sample_TABLE:
  _attributes: {phpName : ABC }
  key : longvarchar

を参照しに行くってことらしい。

カラム定義に書けるモノ

マニュアルには、こう書いてあった。

If you define only one attribute, it is the column type. Symfony understands the usual column types: boolean, integer, float, date, varchar(size), longvarchar (converted, for instance, to text in MySQL), and so on. For text content over 256 characters, you need to use the longvarchar type, which has no size (but cannot exceed 65KB in MySQL). Note that the date and timestamp types have the usual limitations of Unix dates and cannot be set to a date prior to 1970-01-01. As you may need to set older dates (for instance, for dates of birth), a format of dates "before Unix" can be used with bu_date and bu_timestamp.

//ざっくり訳
属性を書けば、symfonyがDBカラムタイプから適当なモノを探して定義する。使える汎用名は boolean, integer, float, date, varchar(SIZE), longvarchar(MySQLのときはTEXT型を意味する )など。ASCIIで256文字以上ならサイズ制限のないlongvarcharを選択する必要がある。(MYSQLだと65KB制限があるが)。DATEとTIMESTAMPはOSで使ってるUNIXの制限を受ける。つまり1970-01-01より以前は指定できないって事。そういうときは"before Unix" を意味する修飾語bu_をつけて "bu_date", "bu_timespamp"とか書けばいい

読んだときに軽く訳したヤツをメモ代わりに貼っておく。