カテゴリー別アーカイブ: PHP

session.use_trans_sidが効かない理由

Cookie非対応の携帯でセッションを扱えるようにするため等に(セキュリティに問題があるが)利用する、

session.use_trans_sidで少しハマったので、メモしておきます。

 

結論からいうと、

session.use_trans_sidによるURL リライト機構は、

出力バッファリングを利用して出力の書換を行うから。

ということです。

 

session.use_trans_sidとは、

PHPのプログラム上にて、セッション管理にCookieを使わずにGET or POSTパラメータでセッションIDを引き回せるようにするために、

目標が相対パス(またはDocumentRootからの絶対パス)でのリンクやフォームに対して、

自動的にセッションIDのパラメータを付加してくれる設定オプションです。

PHPのマニュアルによると、

session.use_trans_sidは、透過的なセッション IDの付加をするかどうかを指定します。

圧倒的に説明が不足している気が・・・w

 

とりあえず、環境は以下の通りです。ただし、今回の原因において環境は関係ないです。

OS Amazon Linux AMI
Webサーバ Nginxリバースプロキシ・Apache + mod_php
PHPバージョン 5.3

 

調べた中でよくある理由としては、

  1. リンクが相対パス(またはDocumentRootからの絶対パス)で書かれていない。
  2. session.use_trans_sidが有効になる(ini_set(“session.use_trans_sid”, 1))前にsession_start()してしまっている
  3. session.use_only_cookiesが有効になっている(PHP5.3からデフォルト有効)

というものがほとんどでした。

ですが、それらは全てクリアした上でなお効かなかったのです。

 

調べているうちに見つけたのがoutput_add_rewrite_var()という関数のPHPのマニュアルの以下の文言。

この関数は、URL リライト機構に新しい名前/値の組を追加します。 名前および値は、URL (GET パラメータとして) およびフォーム (hidden フィールドとして) で追加されます。これは、session.use_trans_sid で透過的 URL リライティングが有効になっている場合に セッション ID が渡される方法と同じです。 絶対 URL (http://example.com/..) はリライトされないことに注意しましょう。

この関数の挙動は、php.ini パラメータ url_rewriter.tags によって制御されます。

注意: もし出力バッファリングが有効になっていない場合、この関数を コールすると出力バッファリングが暗黙的に開始されます。

注目すべきはこの部分。

注意: もし出力バッファリングが有効になっていない場合、この関数を コールすると出力バッファリングが暗黙的に開始されます。

出力をリライトするために、出力バッファリングを使用しているんですね。

 

そこで、ソースを見直してみると、

こんな記述が・・・

 

 

 

ob_end_clean()

 

 

 

 

犯人はお前だぁ~~~~

 

 出力バッファリングを無効にしてしまっていたために、

書き換えが行われなかったという訳でした。


log4php – LoggerAppenderMongoDB

最近、サーバ台数10台を越えるくらいの案件をメインでやっているのですが、

サーバ台数が増えると考えなくてはいけないことの一つがログの管理。

何か調べるために10台からのサーバを見て回るなんてもってのほかです。

 

アプリケーションのログはlog4phpでファイルに書き出していたのですが、

log4phpにLoggerAppenderMongoDBなるものがあることに気がつきました。

mongoDBってNoSQLの一種だよなー」程度にしか知らなかったので、

試しに検証してみたメモです。

 

まずは、mongoDBのインストールから。

インストール方法は公式サイトで調べました。

OSは、AWSのLinux AMIで検証しています。

公式サイトには、「Red Hat,Cent OS,fedoraでのインストール」としてまとめられていたので、

Red Hat系なら全て同じ方法で大丈夫だと思います。

まずは、yumでインストールできるように公式リポジトリの設定ファイルを設置します。

# vi /etc/yum.repos.d/10gen.repo

以下のように記載します。

[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1

そして、インストール

 # yum install mongo-10gen mongo-10gen-server

インストール完了!

 

次は、PHPからmongoDBへアクセスするための設定です。

PECLは入っている前提です。

mongoDBモジュールのインストール。

# pecl install mongo

mongoDBモジュールを読みませるようにします。

# vi /etc/php.d/mongo.ini

以下のように記載します。php.iniに直で書いてもOKです。

extension=mongo.so

以上で、環境面の準備はOKです。

 

最後に、log4phpの設定です。

以下のようなlog4phpの設定ファイルを作って、log4phpに食わせます。

<configuration xmlns="http://logging.apache.org/log4php/">
    <appender name="default" class="LoggerAppenderMongoDB">
        <param name="host" value="mongodb://ホスト名またはIPアドレス" />
    </appender>
    <root>
        <appender_ref ref="default" />
    </root>
</configuration>

以上で終了です。

 

mongoDBは、スキーマレスなデータベースなので、データベースの作成やテーブルの作成は必要ありません。

勝手に作って、勝手に保存してくれます。

今回は、検証用なので最低限の設定しかしていませんが、

実際に使う場合には、mongoDBへの接続IDやパスワードの設定をした方が良いでしょう。

 

mongoDBにちゃんと格納されているかは、

コマンドラインから確認しても良いですが、

phpMoAdminなるものを発見したので、使って見ました。

インストール方法は、Myの方と同じでダウンロードして公開ディレクトリ上で展開するだけだったと思います。

Myの方のような高機能さは無かったですが、

まずmongoDBのクエリの書き方がわからないので、GUIがあるだけでも良いかなと思いました。

クエリの書き方はマニュアル(日本語がありました)を見たところ難しくはなさそうだったので、

おいおい覚えたいと思います。

 

ApacheやNginxのアクセスログ等をリアルタイム収集するのに、

最近注目されているFluentdなんかもmongoDBに標準対応しているので、

組み合わせれば全部のログをmongoDBで一括管理できるんじゃね?って思ったりしています。

mongoDBはパフォーマンスも高そうなので期待しています。

Fluntedも近いうちに検証するので、その時にまた書きたいと思います。