fslashtの日記: Linux + Apache + PHP + PostgreSQL
STATUS: 故障中
今度の案件はタイトルのような感じでで思いっきりベタだなあ。
高速化のため DBにあるマスターテーブルをWebサーバのメモリにあらかじめロードしておきたいんだけど、PHPってずっとメモリを保持しておくにはどうしたらいいんだろう。
保持しておきたいテーブルは、キーに対して値が1つ関連づけられているという単純な構造なのでハッシュテーブルなどで十分。
共有メモリ関連のモジュールを使えばできそうだけど、使うときに一度変数にコピーしないといけないのが性能的に問題ありそう。
ハッシュテーブルとかをそのまま保持してくれるとありがたいんだけど。
○ 解決策案(妄想中
・共有メモリ上の領域を独自に管理
共有メモリ上に取得した領域の中にデータ領域やインデックスの領域を独自に管理してデータ管理を行う。
利点:確保したメモリの必要部分(インデックスと対象データ)のみアクセスするだけで済むのでメモリ転送の無駄は少ないはず
欠点:コード量が増える。PHPでそこまで低レベルな処理を行うと速度的に心配
・RAMディスクとDBMを使う
RAMディスク領域を確保しておいてそのうえにファイルを作り、DBMを使ってDB処理をする
利点:コーディングが楽
欠点:DBMのオーバーヘッドで速度的に心配
・PHPのモジュールを作る
メモリ上にデータ格納・検索するモジュールを作る
利点:たぶん処理効率は一番高い
欠点:作るのが大変。標準の環境ではなくなる
※モジュールで確保したメモリってずっと残ってるのかな
・メモリ保持用プロセスを常駐しておく
CLI版のPHPでデータ格納・検索用のプログラムを作って、常駐しておく。(起動時にDBからテーブルを一括して読み込んでおく)
WEBサーバ側のPHPスクリプトからは、Scoket等で呼び出す。
利点:全部PHPで作れる(利点か?)
欠点:プロセス間通信のオーバーヘッドが心配。PHPでマルチスレッドなサーバー作れたっけ?(応答を一瞬で返せるならシングルスレッドでもいいか)
Linux + Apache + PHP + PostgreSQL More ログイン