Mac OS X 10.6 Snow Leopard で rep2 を動かす

虹色の林檎はどんな味?さんのエントリー

Snow Leopard で rep2 が動かない
MAMP を使ってみることにした

で、Mac OS X 10.6 Snoe Leopard でrep2がエラーを吐くってんで調べてみました。 ちなみに私の環境は10.5からのアップグレードなのでphpは走ってます。 走らせるにはこちらの方法を採ればいいんじゃないかな?

さて、そいでわ始めますが、取り敢えず公式の「動かそう」を転用

  1. サーバを立ち上げて、PHPが動くようにする。
  2. rep2ディレクトリをサーバからアクセスできる所(「~/Sites」とか)へ置く。
  3. rep2ディレクトリの中にデータ保存用のディレクトリを作成する。(デフォルトでは「data」ディレクトリ)
  4. データ保存用ディレクトリのパーミッションを「707」(または777)にする。
  5. 必要に応じて、 conf/conf_admin.inc.php などのconfファイルをテキストエディタで開いて設定編集。
  6. ブラウザから、
    http://127.0.0.1/~(ユーザ名)/rep2/index.php
    てな具合にrep2ディレクトリへアクセス。

私の場合、ダウンロードしたrep2は展開してディレクトリーを

/Library/WebServer/Documents/

に入れました。 んでこのフォルダと内包するものを全て707のパーミッションにしました(2の部分です)。 んでdataフォルダを作る(3、4)んですけど普通にこれはパーミッションが707になってる筈。

5はスキップ。 テスト環境なんで何もしませんでした。 となると、アクセス先は

http://127.0.0.1/rep2/

となります。 アクセス! どーん!とエラーが発生します。 ふげー!

Deprecated: Assigning the return value of new by reference is deprecated in /Library/WebServer/Documents/rep2/includes/HTTP/Request.php on line 402
Deprecated: Assigning the return value of new by reference is deprecated in /Library/WebServer/Documents/rep2/includes/HTTP/Request.php on line 722
Deprecated: Assigning the return value of new by reference is deprecated in /Library/WebServer/Documents/rep2/includes/HTTP/Request.php on line 735
Deprecated: Assigning the return value of new by reference is deprecated in /Library/WebServer/Documents/rep2/includes/HTTP/Request.php on line 780

Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at /Library/WebServer/Documents/rep2/includes/HTTP/Request.php:402) in /Library/WebServer/Documents/rep2/lib/Session.php on line 55
Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at /Library/WebServer/Documents/rep2/includes/HTTP/Request.php:402) in /Library/WebServer/Documents/rep2/lib/Session.php on line 55

Warning: Cannot modify header information – headers already sent by (output started at /Library/WebServer/Documents/rep2/includes/HTTP/Request.php:402) in /Library/WebServer/Documents/rep2/lib/P2Util.php on line 1145
Warning: Cannot modify header information – headers already sent by (output started at /Library/WebServer/Documents/rep2/includes/HTTP/Request.php:402) in /Library/WebServer/Documents/rep2/lib/P2Util.php on line 1146
Warning: Cannot modify header information – headers already sent by (output started at /Library/WebServer/Documents/rep2/includes/HTTP/Request.php:402) in /Library/WebServer/Documents/rep2/lib/P2Util.php on line 1147
Warning: Cannot modify header information – headers already sent by (output started at /Library/WebServer/Documents/rep2/includes/HTTP/Request.php:402) in /Library/WebServer/Documents/rep2/lib/P2Util.php on line 1148
Warning: Cannot modify header information – headers already sent by (output started at /Library/WebServer/Documents/rep2/includes/HTTP/Request.php:402) in /Library/WebServer/Documents/rep2/lib/P2Util.php on line 1149

都合で3ブロックに分けました。 問題なのは最初のブロックだけで、残りは全て、最初のブロックのエラーが発生し、エラーメッセージが出力されてしまった為に、出力前に行わなければならないセッション・クッキーの出力(っていうかheader出し)が出来ないじゃんか!というエラーです。 ので、最初のブロックのエラーだけ何とかすればこのページではエラーが出なくなると思います。

最初のブロックのエラーはどれも「Assigning the return value of new by reference is deprecated」ってんですね。 戻り値を参照扱いで得ようとしているんですが、っていうかそれは間違っていないんですけど、単にイコールで得られるんです(最近のphpの話)。 ソースを見てみますと

$this->_url = &new Net_URL($url, $this->_useBrackets);

こんな風になってますので、「&」を取り去ります。

$this->_url = new Net_URL($url, $this->_useBrackets);

こんな感じ。 残りの行も全部同じように変更します。

んで再度アクセス! エラーが無くなり、ログイン画面だけ出るようになります。 最初のログインは、入力したアカウントとパスワードの設定になりますので、やってみます。 んでログイン! するとまたエラー!

Deprecated: Function split() is deprecated in /Library/WebServer/Documents/rep2/lib/Login.php on line 765
Deprecated: Function split() is deprecated in /Library/WebServer/Documents/rep2/lib/Login.php on line 765

765行目を見ますと、

list($user, $time, $md5_utpx) = split(‘:’, $dec, 3);

こうなってる。 splitはphp5.3.0では非推奨となります(かつ6.0では削除対象)ので、split系を使うんであればpreg_splitあたりを使うのでありましょうけれども、ソースを見るとコロンでバラすだけなので、正規表現系じゃなくても良さそう。 explodeを使います。

list($user, $time, $md5_utpx) = explode(‘:’, $dec, 3);

こんな感じ。 これで再度アクセスすると、rep2がエラー無しで使えるようになると思います。 っていうか、取り敢えずここまで出来て、板->スレ見られたんで、検証はここで終わりにします。

それでもアレですね、今回のはエラーを全く出力させないようにすれば何とかなっちゃうかも知れないですね。 php.ini弄ってね。