今回は、PHP用のNet_TokyoTyrantを使ってセッションハンドラを作成します。
基本的には、
Tokyo TyrantによるHAなセッションストレージ 2 PHPから利用する篇
に書いてある通りだが、いくつか修正。
Tokyo TyrantによるHAなセッションストレージ 2 PHPから利用する篇
を参考にして作ってみた。
2台サーバを使って、セッション情報を共有できる事を確認するのがゴール。
今回は、セッション格納用のTokyoTyrantを準備する処まで。 Continue reading »
※ProxyPreserveHost Onを設定すると発生しない??
リクエストをプロキシされる側で問題が発生する場合がある。
今回遭遇したのは、$_SERVERに関する部分。
プロキシ:example.jpの80番ポート
APサーバ:example.jpの30080番ポート
とすると、
APサーバにて、$_SERVER['HTTP_HOST']を表示させると
example.jp:30080
となっている。
普通に考えればこれは当然なんだけど、
example.jp:80
になって欲しい。
他にも、 $_SERVER['REMOTE_ADDR']と$_SERVER['SERVER_NAME']も
APサーバ側の情報になる。
そんな時の対処法としては、
$_SERVER['HTTP_HOST'] = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST']:$_SERVER['HTTP_HOST']; $_SERVER['REMOTE_ADDR'] = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR']; $_SERVER['SERVER_NAME'] = isset($_SERVER['HTTP_X_FORWARDED_SERVER']) ? $_SERVER['HTTP_X_FORWARDED_SERVER']:$_SERVER['SERVER_NAME'];
という感じで、HTTP_X_FORWARDED系の情報を使い、プロキシ側に書き換えます。
これを使って、mojaviとかも上手く動くようになりました。
※グローバル変数を書き換えるのは危険な気もするけど…。
今回はクラス周り。
一番、魅力的な部分が、クラス定義の追加
まず、普通にクラスを作る。(self.を付けるとstaticメソッドになる)
class Test def self.disp ; puts "disp" end end Test.disp
これを実行すると、
disp
少しいじる。
class Test def self.disp; puts "disp" end end Test.disp class Test def self.disp; puts "disp(overwrite)" end end Test.disp
これを実行すると、
disp disp(overwrite)
となる。
PHPだとクラスの多重定義になりエラー扱い。
でも、Rubyは上書きしてくれる。
PHPだと、カスタマイズ用に継承させたクラスを使っていたけど
Rubyだとそれがいらない!
カスタマイズ用の空ファイルを作っておいてもいいけどそれすらいらないか。
続いて、文字コード周り。PHP5系とRuby 1.8系の比較です。
まずは、内部エンコーディングの設定。
PHPだと
mb_internal_encoding("UTF-8");
Rubyだと
$KCODE = 'UTF-8'
次に、UTF-8からShift_JISへの変換。
PHPだと
mb_convert_encoding("Shift_JIS", "UTF-8", $str);
Rubyだと
require 'iconv'
Iconv.iconv("Shift_JIS", "UTF-8", str)
まずまず、同じような感じ。
iconvが必要な点に注意!
※1.9系では文字コード周りが便利になったという話を聞きました。
それはまた後日という事で。
PHPのプログラムをRubyへポーティングしようと思っています。
その過程で、PHPとRubyの比較を書いておこうと思います。
PHPの
$obj instanceof TestClass
は、Rubyでは
obj.kind_of?(TestClass)
になる。
?も関数名にできるのは意外にいい仕様だと思う。
PHPだと、
function isValidData($data) { return true; }
と関数名にisとか付けてたけど、
def validData?(data) return true end
って感じにできる。
これって結構直感的だなぁと思った。
PHPの場合
dirname(__FILE__);
bashの場合
$(cd $(dirname $0);pwd)
Rubyの場合
File.expand_path(File.dirname(__FILE__))
もしくは
require 'pathname' Pathname.new(__FILE__).parent.realpath.to_s
Pythonの場合
import os os.path.dirname(os.path.abspath(__file__))

最新コメント