Windows+XamppでSymfony2開発環境を作る

第一回Symfony2勉強会のために、WindowsマシンにSymfony2の開発環境を構築したメモ [2011-10-14 もろもろ更新]

Windows版のPHP, MongoDBでSymfony2

メモリやディスクがふんだんにある場合は、VMWare等の仮想環境を使ってLinuxなりをインストールする方がいいかと思います。理由は、

  • デプロイ先の実機サーバはどのみちLinuxとかが多いだろう
  • 上にも関連するけど、各コンポーネントでWindowsでの実績が少なかったり、Windowsだけ動かないバグがあったりするかもしれない

対象は、仮想環境とか動かすといっぱいいっぱいな非力なノートPCでなんとかしたい人ぐらい。

ちなみにこの手順は2004年に買ったLet’s note R3E, Pentium M 1.1GHz, メモリ768MB, HDD40Gに、Windows XP SP3で動作確認しました。

Xamppで手っ取り早く環境を作る

Xampp使います。既にApacheやMySQLが単体で入ってたら、アンインストールか最低でも止めてください。

[更新 2011-01-31] Xampp 1.7.4が正式公開されました。以下の手順の一部の作業は不要となりました

[更新 2011-10-14] Xamppは1.7.7になってますね

Symfony2にはPHP5.3.2以上が必要ですが、最新のXampp1.7.3のPHPは5.3.1です。動きません。しょうがないので、Xamppの次のバージョン1.7.4のベータ版を入れます。これならPHPは5.3.3

Xampp beta xampp-win32-1.7.4-beta2-vc6.7z ダウンロード

ベータ版は.7zしか提供されてない…

拡張子.7z のファイルの展開。アーカイバによっては対応してないので、7-zip(32bit x86)とか入れる。7Zfm.exeを実行し、ファイル指定してc:\xamppとかに展開。

> cd \xampp
> setup_xampp.bat
適当なキーを押してインストール完了

xampp for windowsからXamppのインストーラをダウンロードして、実行

> xampp-control.exe
Apacheの[Start]を押す

ブラウザでhttp://localhost/にアクセス。xamppのページが出たらOK。「MySQL動いてないけどいいの?」みたいなことが出る。マシンに余力あればMySQLも[Start]してもよい

Symfony2のダウンロード

Sandboxのzipをダウンロード

[更新] symfony.comドメインに移っているので、Symfony.comのdownloadページからダウンロード

適当な場所に展開(c:\xampp\sandbox)

> cd \xampp\sandbox
> \xampp\php\php.exe check.php
不足している設定がエラー・警告で表示されるのでこれをつぶしていく

Apacheからsandboxを呼べるように

sandboxというドメインでアクセスすることにする。

Apacheの設定ファイルで、バーチャルホストを扱うファイルを編集

> \xampp\apache\conf\extra\httpd-vhosts.conf

NameVirtualHost *:80

# sandboxでアクセスしてきたらC:/xampp/sandbox/webにまわす
<VirtualHost *:80>
  ServerAdmin postmaster@sandbox
  DocumentRoot "C:/xampp/sandbox/web"
  ServerName sandbox
  ServerAlias www.sandbox
  ErrorLog "logs/sandbox-error.log"
  CustomLog "logs/sandbox-access.log" combined
</VirtualHost>

# ファイルへのアクセス権を与え、.htaccess等が効くようにする
<Directory "C:/xampp/sandbox/web">
  AllowOverride All
  Order deny,allow
  allow from all
</directory>

Apache再起動

ブラウザからsandboxでApacheにつながるように

hostsファイルを編集

> notepad \Windows\system32\drivers\etc\hosts

# 追加
127.0.0.1 sandbox

# Windows Vista/7とかだと、管理者として実行とかしないと書き換えられないかも

ブラウザからチェックスクリプトを実行

http://sandbox/check.php

水色で表示されたウォーニングを片付けていく

short_open_tagをオフに

“<?”のこと。これはオフにすべき。

# Xamppのデフォルト設定って…

> \xampp\php\php.ini

short_open_tag = Off
;short_open_tag = On

APCを有効にする

APCについても、Xampp 1.7.4の正式版で同梱されているので簡単になりました

ビルド済みのWindows版dllをphp_apc-3.1.5-5.3-vc6-x86.zip からダウンロード、展開

php_apc.dllをc:\xampp\php\ext にコピー

c:\xampp\php\php.ini を開いて、[PECL]の後ろに

extension=php_apc.dll

XSLTを有効にする

Propel使わないととりあえず不要っぽいけど。php.iniで、

# 追加
extension=php_xsl.dll

posix_isatty() CLI出力に色をつける

PHPのposix関数はWindowsでは使えないとマニュアルにあるので、この警告は消せない

正しいタイムゾーンの設定

何か設定してあれば警告は出ないのだけれど、実はXampp Betaのphp.iniはドイツのベルリン時刻になっている。そこで、php.iniを修正

# date.timezone = Europe/Berlin
date.timezone = Asia/Tokyo

その後ろのデフォルトlatitude/longitudeも自分の緯度経度にしておいても良い。どこで使うか知らないけど

sandboxについてきたアプリの実行

クイックツアー参照

http://sandbox/index_dev.php/

Hello, Fabienアプリ

http://sandbox/index_dev.php/hello/Fabien


MongoDBインストール

ダウンロードページ Windows 32bit

説明

今のstable最新は1.6.3。これをダウンロード (どこでもいいんだけど)c:\xamppに展開

> cd c:\xampp\mongodb-win32-i386-1.6.3
> cd bin
> mongod.exe

おっとエラー。DB置き場は手で掘らないといけない

> md \data
> md \data\db
> mongod
Windowsの警告→ブロック解除

MongoDBクライアントから確認

もういっこコンソール開く

> cd \xampp\mongodb-win32-i386-1.6.3\bin
> mongo
> 1+2
3
で良し
> Ctrl+C

PHPからMongoDBを使えるようにする

説明ここ

PHP MongoDBドライバはpeclなので、自分でビルドするか誰かがビルドしたものを持ってくるかしないといけない。ここは当然後者。ここからダウンロードする

VC6でts(スレッドセーフ)なバイナリをダウンロード mongo-1.0.10-php5.3vc6ts.zip

展開

php_mongo.dllをc:\xampp\php\ext にコピー

c:\xampp\php\php.iniを編集 [PECL]の後ろに

extension=php_mongo.dll

PHPから動作確認

Xampp-controlからApacheを再起動([stop]-[start])

http://localhost/ のxamppからphpinfo()を表示

“mongo”でページ内検索。設定が出てればOK

PHPから動作確認

適当なphpファイルを作る(mongo.php)

<?php

$mongo = new Mongo('localhost:27017');
$fuga = $mongo->hoge->fuga;
$fuga->insert(array('1' => 1));
echo $fuga->count();

実行

php mongo.php

実行のたびにエラー無く、表示される数が増えれば動いている

あとやること

Apache, (MySQL), MongoDBをWindowsサービスとしてインストールすると、PC再起動したときに動くようにできる。Apache/MySQLについてはc:\xamppの下にサービスにするコマンドがあるのでそれらを実行。

symfony1.3/1.4がリリースされましたね

PHPのフレームワークsymfonyの新しいバージョンがでました!

リリース文

主な変更点はFivestarさんが簡単にまとめられてます

1.2のメンテナンス期間の終わりを根拠に1.0を使い続けるという人がいて最近悲しかったですが、これで堂々と「新規プロジェクトは1.4で」「1.2は1.3で(可能なら1.4)」とできますね。

メールライブラリとしてSwift Mailer 4が同梱されていますが、まだJISメールの問題が直ってないので、ご注意ください。

単発でsymfony1.3/1.4からメールを送りたいだけなら、日本語JISメールに対応した他のメールライブラリをlib/vendorに突っ込んで呼ぶとかでいいと思います。symfonyとSwift Mailerが用意しているいろいろな技をJISでも活用するには、もう少しお待ちください。

symfonyの導入は、新しい1.3/1.4でも日本語のマニュアルが既に用意されています。

外国語ならなおさら、できる限りのことをしないと伝わらない

PHPの文字エンコーディングの入力チェックを改善する方法について日本語のブログで議論があり、そのパッチを本家に提案したが、却下された、という話が盛り上がっているようです。

バグレポートされた岩本さん自身や、コメント欄やはてなブックマークでは、

  • PHPの開発陣がダメだ
  • マルチバイトに理解がない外国人がダメだ
  • 残念だ

みたいな意見があまりに大勢をしめているので、そのバグレポートを見てみた上で、思ったことを述べたいと思います。

岩本さんのバグレポートを訳すと、こんな感じです

要約:
------------
セキュリティ的な要件により、htmlspecialchars()はバイト列をもっと
厳密にチェックすべきです。XSSするコードが見つかりました。
http://d.hatena.ne.jp/t_komura/20091004/1254665511 [日]

原始的なパッチを書きました。
http://iwamot.com/misc/html.c.patch.20091006
使えるかどうか知りませんが(笑)

再現コード:
---------------
// 越長 UTF-8 列
echo htmlspecialchars("A\xC0\xAF&",     ENT_QUOTES, 'UTF-8');
// 不正な Shift_JIS 列
echo htmlspecialchars("B\x80&",         ENT_QUOTES, 'Shift_JIS');
echo htmlspecialchars("C\x81\x7f&",     ENT_QUOTES, 'Shift_JIS');
// 不正な EUC-JP 列
echo htmlspecialchars("D\x80&",         ENT_QUOTES, 'EUC-JP');
echo htmlspecialchars("E\xA1\xFF&",     ENT_QUOTES, 'EUC-JP');
echo htmlspecialchars("F\x8E\xFF&",     ENT_QUOTES, 'EUC-JP');
echo htmlspecialchars("G\x8F\xA1\xFF&", ENT_QUOTES, 'EUC-JP');

予期する結果:
----------------
何も出てこないこと

実際の結果:
--------------
A_&B_&C&D_&E__&F__&G___&
("_"は不正なバイトを意味します)

もしあなたが日本語でオープンソースのプロジェクトをやってて、他にも毎日バグレポートを受けているような状態で、こんな感じのバグレポートが来て、「問題の詳細はこのURL、アラビア語ですけど」みたいに書かれていたとして、この問題について調査を始めたり、優先してこの問題に取り掛かったりするでしょうか? 僕ならしないと思います。

ましてや、”I don’t know whether it is useful though :)” 「使えるかどうか知りませんが(笑)」ですよ? こういうのは日本的な謙譲の美徳として日本のコミュニティでは通じても(どこでも通じるかはわかりませんが)、およそ真剣に「この問題について知ってほしい、興味を持ってほしい」という態度とは受け取られないと思います。

それまで、複数のブログでいろいろな人がしっかりした問題点の検証や議論を、かなりの長文の日本語でされていて、日本語でそれらを読んでいる人にとっては問題は自明なのかもしれません。

しかし、PHPの開発は英語でコミュニケーションされてますし、彼らが英語で上のバグレポートに出てくる断片からウェブを検索したとしても、日本語での議論のようなまとまった情報は見つからないかもしれません。

日本語で議論されている皆さんの努力にはとても敬意を払っていますが、最終的な問題がPHP本体を直すことにあるのであれば、英語に持っていって相手を説得するときに尻すぼみになっているのは残念です。

僕も英語でバグレポートするのは大変ですし、岩本さんのレポートも、パッチもあるし問題の背景が共有されているなら十分だとは思いますが、何が問題で、直さないとどういう問題が起こるか、起こったとして被害の大きさはどれぐらいか、修正がこれまでの他アプリにどんな副作用を起こしうるか(あるいは起こさないか)、といったことを書かないと、むしろ取り合わないのが普通じゃないかと思います。

はてなブックマークのコメントで書いたところ、岩本さんからこう追記をいただきました。

id:AKIMOTOさんに限らず、私のレポートの仕方が悪かったせいだと思われる方、ぜひ本件を引き継いでいただけないでしょうか。私の望みは htmlspecialchars の文字エンコーディング妥当性チェックが改善されることであって、どなたかが達成されるのであれば、それで万々歳です。採用されるレポートの書き方もそれで分かるでしょうし。

他人の英語について何かコメントしたら、こういう返しをされるだろうな、というのはわかっていました。

しかし、それぞれの人はそれぞれの優先順位があります。この問題が無視できる問題だ、とは僕は思いませんが、僕自身がこの先解こうとしている他の問題に比べれば、自分で引き継ぐほど差し迫った不利益を受けていませんし、また、議論されているみなさんほど、この問題について精通してもいません。英語が書けるというだけで、誰もが替われるような話ではないでしょう。少なくとも僕にはこの件の翻訳ボランティアになる動機がありません。

ただ、それが「自分に取って優先順位の高い問題で、どうしても通したい」ときにどうしてるか、は紹介できるかと思います。

ちょうど昨日、僕も一本のバグレポートを書きました。主な興味の対象のレイヤーが違うのですが、PHPのメールライブラリSwift Mailerのバージョン4に関するもので、日本独自仕様の提案に関係するものです。

具体的には、NTT Docomoなどが過去に間違って導入した、RFC違反の形式でピリオドを持つメールアドレスを受け付ける特別なモードを導入してほしい、というものです。

PHPとSwift Mailerではレイヤーも規模も、何もかも違いますが、

– 何が問題なのか
– その問題に他のアプリケーションはどう対処しているのか
– mail addressの場合、iPhoneやGmailが日本市場向けに何をしているか書きました
– 文字エンコーディングの入力チェックの場合、他の言語や処理系でどう扱っているか、というような話になるかと思います
– その変更を採用することで、既存のユーザーに影響するか
– 今回は影響するもの、影響しないものを合わせて複数の取りうる修正案を併記しました

といったことをまとめ、何が問題で、どうしてこんなばかばかしいRFC違反のメールを受け付けられることが日本の一部のユーザーにとって(ひいてはSwift Mailerの日本での普及にとって)大事か、というのを伝えようとしたつもりです。なんといっても、こんな修正日本以外のユーザーには何のメリットもないですからね。

# ちなみにこのレポート書くのに何日もかかってます。英語でブログ書いてるからといって、複雑な内容を一瞬で書けるわけではもちろんないです。

このメールの件は、いわば「悪い仕様を追認する」汚い修正なので、念入りにiPhoneなど他社の対応状況も添えましたが、PHPのエスケープで起こる問題が本当に筋のいいものであれば、これまでの日本語での議論をきっちりまとめて伝えることで、それよりは受け入れやすいのではないかと思います。

英語でバグレポート書くのも大変でしょうし、却下されれば凹みもするでしょうけれど、それを日本語に持ち帰ってきて「残念だ、残念だ」と騒いでも、それは決して相手に伝わらないですよ。

はてブコメントで「残念」と書いている人の中に、そのバグレポートを開いて見てみた人がどれぐらいいるんでしょうか。

「いつもの同じ問題」じゃないとわからせるには、わからせるだけの証拠を積み上げて見せないといけないし、バグレポートで届かないなら、(英語の)ブログを書いたりサイトを立ち上げたり、メーリングリストで問題提起したり、却下した本人にメールしたり、いろいろとあるのではと思います。

この問題で議論されているみなさんの努力、バグレポートまで書かれてチャレンジされた岩本さんの努力には(一PHPユーザーとして)たいへん感謝していますが、努力することが重要なのじゃなくて、どうやって自分(達)の意を通すかが大事ではと思います。それが「PHPのせい」「コアチームのせい」「英語のせい」「外国人のせい」で終わってしまうとしたら、僕はそれが残念です。

# あと、↑途中書いた僕自身のスタンスをよく読まずに「じゃあお前やれば」とコメントしないでくださいね。僕の次のバグレポートは、Swift Mailerでのiso-2022-jpサブジェクト行のエンコード&行分割に関するものになる予定です

[追記 2009.10.09]

徳丸浩さんが、PHPが今すぐ直らないとしても実施できる、このセキュリティホールが起こりうる条件と、その回避法についての解説をまとめられています。

[追記 2009.10.09]

moriyoshiさんが最初のバグレポートをcomitしてくださいました。ありがとうございます。

将来のマイナーアップデートリリースでこの問題は解消されるでしょう。実際に今このセキュリティホールが有効になる条件下のアプリケーションを運用されている方は、個別にパッチをあてたPHPをビルドして差し替えるか、上の徳丸さんの対策を行なう必要はあります。

Symfony Meetup Tokyoやります

PHPカンファレンス当日でいろいろと連絡が滞っていてすみません。

6(日)昼の「symfonyのFabienさんと東京観光」は予定通りやります。これまで参加を表明された方は、朝10:00に四谷に集まると思っていてください(途中から参加とか遅れる人のために、あとでメールで詳細は送ります) まだ人数増やせると思うので参加表明はこちらを読んでください。

6(日)の夜、こちらも四谷近辺で、Symfony Meetupをやります。懇親会です。いい機会なのでsymfony使いで集まってゴハンを食べましょう。

申し込みフォーム

Symfony Meetup Tokyoは盛況のうちに終了いたしました。参加くださったみなさま、ありがとうございました!

技術メディアのみなさん、symfonyのFabien Potencierさんへの取材どうでしょう?

PHPカンファレンスの開催がいよいよ明日・明後日となりました。

今回は、10周年ということで海外からも3名の講演者をお呼びしての充実したカンファレンスとなっています。(参加は両日とも満員で締め切っています)

symfonyのリーダーFabien Potencierさん、FacebookのBrian Shireさん、台湾PHPユーザー会の江 明宗さんのお三方は、なかなか東京で話せる機会もないと思いますので、ぜひ取材等いかがでしょうか? (拙いですが通訳できます)

特に、カンファレンス当日はPHPカンファレンスのメディアスポンサー各社(スポンサーありがとうございます)のみなさまに、ぜひ取材いただければと思います。

ご興味ありましたら、ぜひPHPカンファレンスでお声をかけていただくか、akimotoアットgmailかtwitter.com/akkyまで御連絡ください