Archive for the ‘CODING’ Category

奮闘記01

Monday, May 18th, 2009

さて私が何と格闘したかと言えば、WordPressMUである。
なんかもう定番の観すらあるね。強敵である。
そもそもデータベース初心者でPHPも大して使ったこと無いヤツが、
WordPressのような巨大なPHPアプリを読み解こうと言うのが
オコガマシイのではあるけれども。

今回の課題は、ローカルにWPMUをインストールである。結論から言うと未だ成功していない。
そのものズバリのローカルPCにWordPressMUをインストールなんてページがあったので、
大分参考にした。何でそんなことするの?と言えば、サーバ上ではセキュリティ上の理由から(当然ながら)エラー表示は抑制されてしまう。
しかし初心者の私はエラーログとかエラーメッセージがないと、どこでエラーってるのかよくわからん。
サーバの設定を書き換えるのは(レンタルサーバなので)無理だから、じゃ〜ローカルにインストールしてみますか。
という単純な発想。そこでこんなに詰まるとは…!

私がやった手順を一応書いて置こう。間違いを指摘してくれる人とか現れないかなw
小文字で書いた所は適当に書き換えてます。
因に環境はWinXP、Apache2.2.11、PHP5.2.8、MySQL5.0.77です。細かいVer情報追記。

  1. ソースと日本語化パッチ?をダウンロードして、ドキュメントルート下のサブディレクトリに解凍
  2. MySQLでCREATE DATABASE databasename DEFAULT CHARACTER SET utf8;
  3. MySQLで管理者を追加(GRANT ALL ON *.* TO username@”%” IDENTIFIED BY ‘password’ WITH GRANT OPTION)
  4. もう一丁管理者を追加(上記ページの情報より)GRANT ALL ON *.* TO username@localhost IDENTIFIED BY ‘password’ WITH GRANT OPTION
  5. あーもしかしてFLUSH PRIVILEGESし忘れたかも?
  6. C:\WINDOWS\system32\drivers\etc\hostsを開いて、127.0.0.1にwp.muという別名を設定
  7. DocumentRootに直接インストールしたい訳ではないので、DocumentRootはhtdocsにしておく
  8. Apache再起動
  9. http://wp.mu/dirname/index.phpにアクセス(インストールスクリプトまでは動く)
  10. Submitしても凍りついて先に進まない(ブラウザがフリーズとかではない)

その後の原因究明活動〜。

  1. 取り敢えず複数回同じ動作を行う
  2. ダメなので、MySQLとApacheをつけたり消したり
  3. ダメなので、ProcessExplorerで監視しながらやってみる
  4. どうやらMySQLのモジュールが動いていないとか言う訳ではないらしい(瞬間的にCPU使用量が増加している)
  5. お手上げーなのでフォーラムを覗く
  6. mail関数周りのせい?
  7. しかしデータベースに新しいテーブルが作成されていない!…ということはそれ以前の問題か…。

結論:ワカンネ
家に帰ったらエラーログを洗おう…。PHPのエラーならエラーメッセージが出て実行停止するはずだしなー。
あとはこのへんを参考にして、データベース自体を一回消去してみるべき?
でも何も書き込まれてないんだが…。いっそrootユーザでアクセスしてしまうかw
そもそもPHPでMySQLが使える様に設定できてないとか?いやいや。

    対処方針

  1. php.iniでMySQLが使える設定になっているかチェック
  2. FLUSH PRIVILEGESしてみる(多分無意味)
  3. rootユーザでアクセスしてみる
  4. mail関数周りの設定を変えてみる
  5. データベースを一度消去(実害はないので)

とりあえず今考えられる対処法はこれくらいかー。エラーログをちゃんと読まないとダメだなー。
では次回朗報を書けることを祈りつつ。

窪田-タイトルは短く本文は長く-史朗

愚痴めいた技術的文書

Monday, May 4th, 2009

半ば以上覚書である。これをこのBlogに書く意味があるのか気になるが、
もしかしたらWPMUで困っている他のヒトが見つけて喜ぶかもしれないので、敢えて書く。

さて私のWPMU暦は1月程度である。いや、以下か。
とりあえず、みんなのバイブルへリンクを張っておく。

さらに、私が参考にしまくったページを挙げておこう。

  1. CODEXの中のデータベース概要
  2. 同関数リファレンス
  3. 英語版の、WPMU_Functions
  4. 同じく、Global_Variables

そもそも私が本格的にWPMU向けコーディングを始めたのは、某サイト管理者から、
「こんな感じの出力をしたい」と相談を受けたためである。
RSSワカンネと思いつつ、参考資料として渡された、コレのソースを解読するのが、私の作業の始まりであった。

SQLシラネと思いつつも、適当に見当をつけて、
自分のブログにテスト記事を投稿して反応を見、
大体把握する。重要だったのは、


$blog_list = $wpdb->get_results( "SELECT blog_id, last_updated FROM " . $wpdb->blogs. " WHERE public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted ='0' " . $order . " " . $limit . "", ARRAY_A );

このへんと、


get_blog_option( $bid, "blogname");

このへんであった。

この時点では理解していなかったが、最初のget_resultsの方では、
先ほどリストで挙げた、グローバル変数のテーブルからデータをひっぱて来ている。

そしてなんだかんだやっていて、投稿のデータをどうやって取得するかが問題になった。
最初はこの関数が使えないかと思ったのだが、どうやらコレは特定のブログにおいてだけ使える(ブログをまたいで記事を取得できない)らしいことが分かった。

んー。どうしたものか…。なにやら検索を繰り返しているうちに、この関数に辿りつく。しかし、最新の投稿のpost_idなんてどうやって取得するんだ?分からん。。。

しばらく眺めていると、get_blog_postの$wpdb->get_row();を、$wpdb->get_results();に変えたらどうなるかなーと思いつく。この頃になると、大分SQL文の構造が分かってきたのである。
そこでとりあえずWHERE句を消して、get_resultsに置き換えたものを走らせて見る。
怖いので、自分のblog_idだけにしておく。

おお!なんか上手くいったみたいだぞ?

こうなりゃこっちのものである。帰ってくる構造体がデータベース概要にあった、wp_postsであることも分かったので、WHERE句で欲しいデータを検索できるようになる。さらに、ORDERで当初はdateの降順にしていたのだが、last_modified降順の方が適切な気がしたので、そうする。

こうして骨組みが出来上がった。
この辺でやっと最終的にどうやって実行するか考える。
うーんやはりプラグインにすべきか…?この段階でようやっと、プラグインの作り方を読み始める。
テンプレートタグとして作るなら、特に何も考えずに関数を書けばいいだけらしい。
そうすることにした。しかし上記ページを読んでいて、コーディング基準に従ってください、とあったのでリンクを飛ぶと、

オレの書き方と全然違う…。しかもデータベースにはなるべく触るなと書いてある…。
「止むを得ない場合を除き」だからまぁ良いか…。と言いつつも、当初は全部データベースから直接データを取得する方法で書いていたのを、できる所は用意された関数を使うように改める。

この辺で、要素技術は大体そろった。しかし、定番であるが、くっつけると何かしらエラーが出るモノである。大体、変数名が食い違ってるとか、書き足した行末にセミコロンがないとか、そんなくだらないことなのだが、WordPress上にPHPを書き込んでも、エラーメッセージは出ない。当然だけど…。しかも、データベースなどWP上じゃないと意味を成さない変数関数が山ほどあるので、ローカルで実行してエラーを洗い出すわけにも行かない。

しょーがないから、上のほうから意味を成すブロックごとに区切り、書いてはプレヴュー、の繰り返しでエラーチェックをしていく。さっきまでエラーが出ておらず、今回の更新でエラーが出たなら、足した部分がおかしいはず、ということで。

意外だったのが、コメントを途中で書き込んでもちゃんと処理される、ということ。
最初はテキストエディタに書き込んだコードをWPに貼り付ける際いちいちコメントを消していたのだが、結論から言うと必要ない作業だった。

それから、これはPHPの仕様かもしれないが、空文字列かどうかの評価が上手く働かなかった。
つまり、ある文字列$strがあったら、if($str=”)とやっても予期した結果が出ない。
PHPManualを見て、空文字列はFALSEに評価されるとあったので、if($str)にして、ifのブロックとelseのブロックを入れ替えたら、大丈夫だった。

あと、どうもヒアドキュメントはWPMUでは上手く動かないらしい。

これもPHPの仕様かもしれないが、文字列の中で(もちろんダブルクォートでクォートした場合の話であるが)変数はきちんと展開されるのだが、関数は中括弧{}で囲んでも、全くパースされない。記憶が正しければ、普通のPHPだったらコレでも大丈夫だった気がするのだが…。

Protected: WPDB-TEST

Saturday, May 2nd, 2009

この記事はパスワードで保護されています。