hypweb.net
XOOPSマニア  最新情報のRSS(サイト全体)
[ 自宅サーバーWebRing |ID=54 前後5表示乱移動サイト一覧 ]

TOP » UsersWiki » nao-pon » blog » 2010-04-10

RSS of nao-pon/blog
2010 4月 10 (土)
 

PHP >= 5.2.10 + APC での session_set_save_handler() 問題の解決法 anchor.png

このページの以前の内容は間違いでした。(2011-10-21 追記)

Page Top

正解は次のような感じです。 anchor.png

    • セッションのカスタムハンドラでオブジェクトを使用している時にセッションが保存されない場合は、カスタムハンドラオブジェクトのデストラクタで session_write_close() を コールする。
    • PHP: session_set_save_handler - Manual

      PHP 5.0.5 以降、write ハンドラおよび close ハンドラはオブジェクトが破棄されたあとにコールされます。 そのため、セッション内でデストラクタを使用可能ですが、 ハンドラ内ではオブジェクトを使用できません。

      この「ニワトリが先かタマゴが先か」の問題を解決するために、 デストラクタから session_write_close() を コールすることが可能です。

    • XOOPS 2 の場合、kernel/session.php の XoopsSessionHandler クラスにデストラクタを追加することで APC 使用時も問題なくセッションが使えるようになる。
      •     // for PHP >= 5.0.5
            function __destruct() {
                session_write_close();
            }
Page Top

以下は当時の記事で間違った対応策。 anchor.png

2010-01-13 の Blog で、PHP 5.3.1 + APC APC-3.1.3p1 で、XOOPS のセッションが正常に機能しなくて、ログインできない問題があると書いて、なんとか適当な修正で乗り切ってきたけど、正解ぽい修正案を見つけたので、試してみたところ上手くいった。

  • PHP5.2.10とAPC3.0.19の組み合わせでsession_set_save_handler()を使うと不具合が生じる。 - 浅倉卓司@blog風味? - ひとりでもグループ
    • 終了処理の順番が問題らしい。PHP5.2.10 以降では、スクリプト終了時のセッションの終了処理の前にエクステンションの終了処理(PHP_RSHUTDOWN)が実行されるようになったらしい。

      なので、APCの終了処理で、セッションハンドラーオブジェクトが破棄されてしまいセッションの書き込み処理が行われないという状況になっていた模様。

  • 徒然と: pecl-APCとphp-5.2.10
    • このページに上記の問題を解決する方法そのものがバッチリ紹介されていた。
    • その方法: APC の終了処理を PHP_RSHUTDOWN から ZEND_MODULE_POST_ZEND_DEACTIVATE_N に変更する。 :ok:
      --- php_apc.c.org	2010-04-10 20:37:52.000000000 +0900
      +++ php_apc.c	2010-04-10 23:10:44.000000000 +0900
      @@ -314,7 +314,7 @@
       /* }}} */
       
       /* {{{ PHP_RSHUTDOWN_FUNCTION(apc) */
      -static PHP_RSHUTDOWN_FUNCTION(apc)
      +static ZEND_MODULE_POST_ZEND_DEACTIVATE_D(apc)
       {
           if(APCG(enabled)) {
               apc_request_shutdown(TSRMLS_C);
      @@ -1628,10 +1628,12 @@
           PHP_MINIT(apc),
           PHP_MSHUTDOWN(apc),
           PHP_RINIT(apc),
      -    PHP_RSHUTDOWN(apc),
      +    NULL,
           PHP_MINFO(apc),
           PHP_APC_VERSION,
      -    STANDARD_MODULE_PROPERTIES
      +    NO_MODULE_GLOBALS,
      +    ZEND_MODULE_POST_ZEND_DEACTIVATE_N(apc),
      +    STANDARD_MODULE_PROPERTIES_EX
       };
       
       #ifdef COMPILE_DL_APC
      • この修正を php_apc.c に行いリビルドしたら、バッチリOKとなりました。 :thumb_up:

トップ   凍結 差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 514, today: 1, yesterday: 0
初版日時: 2010-04-11 (日) 00:15:49
最終更新: 2010-04-11 (日) 00:15:49 (JST) (5091d) by nao-pon
このページのTopへ
メインメニュー
ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録
最近の更新
オンライン状況
150 人のユーザが現在オンラインです。 (8 人のユーザが UsersWiki を参照しています。)

登録ユーザ: 0
ゲスト: 150

もっと...
サイト情報